4
使用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;
}
這是根本的不是準確的gcc的問題還是我失蹤一些關於如何嚴格的別名工程。
另外,是否有一個簡單的方法來解決這個問題,使用__attribute__((__may_alias__))
還是我也一樣鑄造成臨時char *?
'__attribute__((aligned(16)))'似乎毫無用處。 – 2014-12-06 08:50:10
@MarcGlisse你爲什麼這麼說?我認爲'_mm_cmpgt_epi32'的參數必須對齊。 – user1794469 2014-12-30 15:05:50
'__m128i'已經意味着合適的對齊(否則使用起來會非常痛苦)。 – 2014-12-30 15:12:28