LLVM Assembly programozási nyelv

Típusok, típuskonstrukciók

Típusszerkezet

Az LLVM szigorú típusrendszerrel rendelkezik, ami miatt könnyebben olvasható a szokásos assembly nyelveknél, és lehetővé tesz számos program-analízist és transzformációt.

Elemi típusok

Egész típus(ok)

A nyelvben hasaználható egész típusok nevei iN alakúak, ahol N egy pozitív egész szám, amely a típus által reprezentálható egész számok bitszélességét jelenti. Például: i1 egy bites, i32 egy 32 bites egész szám. Az előjeles és előjel nélküli típusok nincsenek megkülönböztetve, ezt az értékekkel végzett műveletek határozzák meg.

Valós típus(ok)

Lebegőpontos számok ábrázolására az alábbi, rögzített méretű típusok állnak rendelkezésre:

TípusLeírás
half16 bites lebegőpontos érték
float32 bites lebegőpontos érték
double64 bites lebegőpontos érték
fp128128 bites lebegőpontos érték (112 bites mantisszával)
x86_fp8080 bites lebegőpontos érték
ppc_fp128128 bites lebegőpontos érték (két 64 bites)

Mutató típus(ok)

Mutató típus bármely típusból képezhető egy '*' hozzáadásával. Például: i32* egy mutató egy 4 bites egész számra. Az indirekció lehet többszörös (i32**** is megengedett).

Egyéb típusok

Az üres típus (void) használható visszatérési értékek hiányának jelzésére. Ez a típus méret nélküli. A label típus a kódban elhelyezett címkék típusának azonosítására. Ez azért fontos, mert a vezérlést megvalósító, például ugró utasítások ilyen típusú értékekkel tudnak dolgozni.

Típuskonstrukciók

Tömb típus(ok)

Rögzített számú, egyforma típusú elem tárolására szolgáló típusok. Szintaxis: [elemek száma x elemek típusa]. Például: a [40 x i32] negyven darab 4 bites egész tárolására használható tömb típusa.

Vektor típus

A tömbhöz hasonló típuskonstrukció, de valójában nem számítanak összetett típusoknak. SIMD műveletek operandusait és eredményeit tárolják bennük. Szintaxis: <elemek száma x elemek típusa>. Például: <8 x float> nyolc darab lebegőpontos szám tárolására használható vektor típusa.

Rekord típus

A C nyelv struktúráihoz hasonló, akár eltérő típusú adattagok együttes tárolására alkalmazható típusok. Szintaxis: { típus1, típus2, ... }. Például: { i8, i32, double* } egy 8 és egy 32 bites egész számot, illetve egy 64 lebegőpontos szám mutatóját tartalmazhatja.

Típuskonverziók

A nyelvben típuskonverziót különböző utasítások segítségével végezhetünk.

Szintaxis: <eredmény> = <utasítás-név> <régi-típus> <érték> to <új-típus>

Utasítás neveLeírás
trunc Egész típusok közötti konverzió, egy nagyobb bitszélességű típusból kisebbre. A felső bitek levágásra kerülnek.
zext Egész típusok közötti konverzió, egy kisebb bitszélességű típusból nagyobbra. Az érték felső bitjei nullákkal lesznek kiegészítve.
sext Egész típusok közötti konverzió, egy kisebb bitszélességű típusból nagyobbra. Az érték kiegészítése során figyelembe veszi az előjelet.
fptrunc Lebegőpontos típusok közötti konverzió, egy nagyobb bitszélességű típusból kisebbre.
fpext Lebegőpontos típusok közötti konverzió, egy kisebb bitszélességű típusból nagyobbra.
fptoui Lebegőpontos típus átalakítása előjel nélküli egész típusra (a nulla írányába kerekítve).
fptosi Lebegőpontos típus átalakítása előjeles egész típusra (a nulla írányába kerekítve).
uitofp Előjel nélküli egész típus átalakítása lebegőpontos típusra.
sitofp Előjeles egész típus átalakítása lebegőpontos típusra.
ptrtoint Mutató típus átalakítása egész típusra.
inttoptr Egész típus átalakítása mutató típusra.
bitcast Konverzió típusok között a bitek megváltoztatása nélkül.

Változók, konstansok

A globális konstansok nevei @ jellel kezdődnek, a lokális változók (regiszterek) nevei pedig % jellel. Az egyetlen operátor az értékadás: =. Egy változó csak egyszer állhat a bal oldalán, ezt nevezik SSA (static single assignment - statikus egyszeri hozzárendelés) formának.

Kifejezések, operátorok

A nyelv tem támogatja az imperatív nyelvekben jellemző további operátorokat és aritmetikai kifejezéseket, ezek helyett a megfelelő utasítások használatára van szükség.