v „pravých“ RISCových procesorech je zvykem používat všechny pracovní registry shodným způsobem
Ale AArch64 zde má taky omezení. Až se autor dostane k ASIMD nebo SVE/SVE2, tak zjistí, že u některých instrukcí není možné adresovat všechny registry. SVE má např. 16 "predicate" registrů, ale většina SIMD instrukcí, které jsou "predicated" umí adresovat jen 8 spodních. Instrukce, kde se používá index "V[index]" umí adresovat jen 16 nebo 8 spodních registrů, atd...
Kratky pohlad na napr. https://web.njit.edu/~rosensta/classes/architecture/252software/code.pdf ti nedava velmi zapravdu. 3 pismena maju fakt len tie uplne najzakladnejsie instrukcie (and, add, sub, eor, ...), vacsinou su to 4-pismenove zapisy (samozrejme, assembler akceptuje and #123 a spravi z toho interne andi #123, ale niekedy je lepsie rozlisovat add/adda/addi/addq pre prehladnost).
Potom su tu samozrejme FPU instrukcie, tam uz aj 4 pismena su malo. :)
Assembler som voľakedy zbožňoval. Napísal som v ňom celkom dosť riadkov, dokonca aj funkčný kompilátor Forth. Samozrejme nemal na fig-Forth a podobné, ale bol môj, fungoval a zaberal cca 2kB, takže nebol problém ho používať na urýchlenie Basicu.
Na presuny som používal LD, takže je jasné že som písal na Zilog, konkrétne ZX-Spectrum, ale inštrukcie MOV mi nie sú neznáme, viackrát som prepisoval a upravoval rutiny pôvodne napísané pre Intel 8080.
Ďakujem za článok, pekne som si počítal a väčšine kupodivu aj rozumel. V assembleri som robil ešte v 80-tych rokoch.
Kompilátor nic nepoznává a téměř nic nekontroluje.
Ostatně, v dobách, kdy všechno muselo mít české názvy, se assembler jmenoval "jazyk symbolických instrukcí", eventuelně "jazyk symbolických adres" a kurs, kde se to učilo, se sice lidově nazýval Assemblery, ale oficiálně "Strojově orientované jazyky".
Kontroluje tak nanejvýš, zda se neodkazujete mimo rozsah nějakého segmentu nebo stránky (podle architektury procesoru). A kdo chvíli programuje (případně zkoumá nějaký kód bez zdrojáku) u jednodušších procesorů za chvíli může ten hexdump číst rovnou.
Pak pár let děláte něco jiného a schopnost se, pochopitelně, vytratí.
Díky za zajímavý článek. Vlastně se divím, proč má Aarch64 zároveň MOV a nulový registr, když v tom případě by se místo MOV X1,X2 mohlo dělat ADD X1,X2,XZR a ušetřila by se tím jedna instrukce. Matně si vzpomínám, že na některých architekturách to tak je (že by MIPS?)
A připadá mi škoda, že když už navrhli celou novou ISA, tak zůstali u 128 bitového SIMD. Mít 256 bitové registry jako AVX by bylo umožnilo pracovat se 4D vektory ve dvojí přesnosti, což by se zrovna u grafiky docela hodilo.
AArch má mov jen pro immediate (konstanty), ostatní mov instrukce jsou jen aliasy jiných instrukcí (ADD, ORR, možná další).
AArch má SVE/SVE2, což je rozšíření, ve kterém délka vektoru není známá. Ale jo, místo 64-bit a 128-bit SIMD mohli už tehdy navrhnout 128-bit a 256-bit - možná by SVE nebylo pak potřeba.
This instruction is an alias of ORR (shifted register).
The equivalent instruction is ORR Wd, WZR, Wm.
SVE/SVE2 jsou spíš na numerické výpočty, AI apod, a tam ani 4*SIMD nestačí. Neon je pořád dobrá varianta na 3D grafiku (i když třeba na násobení pole vektorů maticí by taky bylo SVE užitečné) a 3D grafika si obvykle vystačí se single precision.
Vtipné je, že i přes fixed length instrukce je třeba kód pro násobení 4*4 matic kratší než x86_64 nejlepší varianta v AVX-512 - aarch64 to tam vyhrává díky instrukci vfmaq_laneq_f32, která násobí vybraným prvkem vektoru, navíc u x86_64 s každou verzí roste počet prefixů pro rozlišení instrukce. Kdysi jsem experimentoval: https://github.com/kvr000/zbynek-cxx-exp/blob/master/simd/matrix-multiplication/src/main/cxx/MatrixMultiplicationBenchmark.cxx#L439-L460 . Na rychlost ale stále o cca 60% zaostává (nebo zaostával v době aktuální pro měření)...
To je v podstatě EVEX prefix: https://en.wikipedia.org/wiki/EVEX_prefix
1 byte prefix + další 3 bytes je payload.
Je to přesně jak píše **anonacct**. Já to ještě nezmiňoval, protože jsme si zatím vystačili s mov registr, konstanta, ale přesně tak - mov registr, registrs je pseudoinstrukcí. Stejně jako třeba CMP=SUBS s výsledkem ukládaným do XZR. Assemblery to rozpoznají (to asi není překvapivé), ale i disassemblery taky (objdump atd.) a to je fajn v praxi.