Использования GCC 4.7.2, почему это вызывает строгое нарушение псевдонима:Является строгим псевдонимом только для первого элемента?
#include <stdint.h>
#include "emmintrin.h"
int f(){
int ret = 0;
__m128i vec_zero __attribute__ ((aligned (16))) = _mm_set1_epi32(0);
__m128i vec_one __attribute__ ((aligned (16))) = _mm_set1_epi32(1);
__m128i vec_result __attribute__ ((aligned (16)));
vec_result = _mm_cmpgt_epi32(vec_zero, vec_one);
ret += (((uint32_t*)&vec_result)[0] != 0);
ret += (((uint32_t*)&vec_result)[1] != 0);
return ret;
}
Хотя это нормально:
#include <stdint.h>
#include "emmintrin.h"
int f(){
int ret = 0;
__m128i vec_zero __attribute__ ((aligned (16))) = _mm_set1_epi32(0);
__m128i vec_one __attribute__ ((aligned (16))) = _mm_set1_epi32(1);
__m128i vec_result __attribute__ ((aligned (16)));
vec_result = _mm_cmpgt_epi32(vec_zero, vec_one);
// ret += (((uint32_t*)&vec_result)[0] != 0);
ret += (((uint32_t*)&vec_result)[1] != 0);
return ret;
}
Является ли это просто вопрос НКА не является точной или я отсутствую что-то о том, как работает строгий псевдоним.
Кроме того, есть ли простой способ обойти это с использованием __attribute__((__may_alias__))
, или я просто так же отлично отбрасываю на temp char *?
'__attribute__ ((выровненный (16)))' кажется бесполезным. –
@MarcGlisse, почему вы так говорите? Я думал, что аргументы '_mm_cmpgt_epi32' должны быть выровнены. – user1794469
'__m128i' уже подразумевает подходящее выравнивание (в противном случае было бы очень больно использовать). –