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.