, Stephen Canon,
static inline Vec8s operator - (Vec8s const & a) {
return _mm_sub_epi16(_mm_setzero_si128(), a);
}
Agner Fog Vector Class Library.
, static. static, . ( .bss) .
#include <x86intrin.h>
extern "C" void foo2(__m128i a);
static const __m128i zero = _mm_setzero_si128();
static inline __m128i negate(__m128i a) {
return _mm_sub_epi16(zero, a);
}
extern "C" void foo(__m128i a, __m128i b) {
foo2(negate(a));
}
g++ -O3 -c static.cpp, .
.bss _ZL4zero. , .bss.
.text.startup
pxor xmm0, xmm0
movaps XMMWORD PTR _ZL4zero[rip], xmm0
ret
foo
movdqa xmm1, XMMWORD PTR _ZL4zero[rip]
psubw xmm1, xmm0
movdqa xmm0, xmm1
, GCC XMM . .
, _mm_sub_epi16(_mm_setzero_si128(),a)? GCC foo
pxor xmm1, xmm1
psubw xmm1, xmm0
movdqa xmm0, xmm1
Intel Sandy Bridge pxor "". . , , , , .
, _mm_sub_epi16(_mm_set1_epi32(-1),a). GCC
pcmpeqd xmm1, xmm1
psubw xmm1, xmm0
movdqa xmm0, xmm1
pcmpeqd free , - , movdqa. , 0 -1 . _mm_sub_epi16(_mm_set1_epi32(1))? GCC foo
movdqa xmm1, XMMWORD PTR .LC0[rip]
psubw xmm1, xmm0
movdqa xmm0, xmm1
, ! , , .LC0 (.rodata).
: GCC .
register __m128i zero asm ( "xmm15" ) = _mm_set1_epi32 (1);
movdqa xmm2, xmm15
psubw xmm2, xmm0
movdqa xmm0, xmm2