2016-07-06 32 views
1

Ich habe einen Kompilierfehler "Argument muss eine Konstante sein" bei Verwendung von NEON intrinsischen vshr_n_u32. Der Funktionsprototyp ist:NEON intrinsisch, kompilieren Fehler "Argument muss eine Konstante sein" bei der Verwendung von vshr_n_u32

__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) 
vshr_n_u32 (uint32x2_t __a, const int __b) 
{ 
    return (uint32x2_t)__builtin_neon_vshr_nv2si ((int32x2_t) __a, __b, 0); 
} 

Und hier ist meine Funktion:

uint32x2_t shift_func(int index) 
{ 
    int shift_bit[] = {2, 4, 5, 6, 7, 8, 9, 10}; 
    int n_val = shift_bit[index]; 

    uint32x2_t src_reg = {16, 32}; 
    return vshr_n_u32(src_reg, n_val); 
} 

Der Wert n_val kann nur zur Laufzeit bekannt sein. Aber nach Kompilierungsfehler scheint es, dass der Wert n_val zur Kompilierzeit bekannt sein sollte. Obwohl der Typ __bconst int ist, denke ich, dass es richtig sein sollte, eine int-Variable einzugeben.

Wie den Kompilierungsfehler zu entfernen? Oder wie benutzt man vshr_n_u32 in dieser Funktion?

Antwort

3

Die Verschiebung in vshr_n_u32 muss eine kompilierte Literalkonstante sein, da der Verschiebungswert als Teil des ARM-Befehls selbst codiert wird. Da Sie nur wenige mögliche Verschiebungswerte haben, sollten Sie für jeden Fall eine switch-Anweisung verwenden. Oder Sie könnten einfach vshl_u32 mit einer negativen Verschiebung verwenden (Sie übergeben einen zweiten int32x2_t Parameter, der die Verschiebungswerte enthält).

+1

Vielen Dank! Das ist hilfreich. – maofu