статические / статические локальные переменные SSE / AVX блокируют регистр xmm / ymm?

При использовании встроенных функций SSE часто требуются нулевые векторы. Один из способов избежать создания нулевой переменной внутри функции всякий раз, когда функция вызывается (каждый раз эффективно вызывая некоторую векторную инструкцию xor), состоит в использовании статической локальной переменной, как в

static inline __m128i negate(__m128i a)
{
   static __m128i zero = __mm_setzero_si128();
   return _mm_sub_epi16(zero, a);
}

Кажется, переменная инициализируется только при первом вызове функции. (Я проверил это, вызвав истинную функцию вместо встроенной функции _mm_setzero_si128 (). Кстати, это возможно только в C ++, а не в C).)

(1) Однако, как только эта инициализация произошла: блокирует ли это регистр xmm для остальной части программы?

(2) Еще хуже: если такая статическая локальная переменная используется в нескольких функциях, заблокирует ли она несколько регистров xmm?

(3) наоборот: если этоне блокируя регистр xmm, будет ли нулевая переменная всегда перезагружаться из памяти при вызове функции? Тогда статическая локальная переменная была бы бессмысленной, так как было бы быстрее использовать _mm_setzero_si128 ().

В качестве альтернативы я думал об установке нуля в глобальную статическую переменную, которая будет инициализирована при запуске программы:

static __m128i zero = _mm_setzero_si128();

(4) Останется ли глобальная переменная в регистре xmm во время работы программы?

Большое спасибо за вашу помощь!

(Поскольку это также относится к встроенным функциям AVX, я также добавил тег AVX.)

Ответы на вопрос(4)

Ваш ответ на вопрос