2016-07-06 6 views
1

J'ai une erreur de compilation "l'argument doit être une constante" lors de l'utilisation de NEON intrinsèque vshr_n_u32. Le prototype de la fonction est:NEON intrinsèque, erreur de compilation "argument doit être une constante" lors de l'utilisation de 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); 
} 

Et voici ma fonction:

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); 
} 

La valeur de n_val ne peut être connue au moment de l'exécution. Mais selon l'erreur de compilation, il semble que la valeur de n_val devrait être connue à la compilation. Bien que le type de __b soit const int, je pense qu'il devrait être bon d'entrer une variable int.

Comment faire pour supprimer l'erreur de compilation? Ou comment utiliser vshr_n_u32 dans cette fonction?

Répondre

3

Le décalage dans vshr_n_u32 doit être une constante littérale à la compilation, car la valeur de décalage est codée dans le cadre de l'instruction ARM elle-même. Comme vous n'avez que quelques valeurs de décalage possibles, vous pouvez utiliser une instruction switch pour gérer chaque cas. Ou vous pouvez simplement utiliser vshl_u32 avec un décalage négatif (vous passez un second paramètre int32x2_t contenant les valeurs de décalage).

+1

Merci, c'est utile. – maofu