Я хотел бы знать, нарушаю ли я строгие правила сглаживания с помощью этого фрагмента. (Я так думаю, так как это разыгрывает планетарный указатель, однако это делается в одном выражении и /Wall не плачет.)
inline double plop() const // member function
{
__m128d x = _mm_load_pd(v);
... // some stuff
return *(reinterpret_cast<double*>(&x)); // return the lower double in xmm reg referred to by x.
}
Если да, какое обходное решение? Использование разных представлений одновременно становится хардкорным, если вы хотите уважать спецификацию.
Спасибо за ваши ответы, я теряю свое хорошее настроение, пытаясь найти решение.
Ответы, которые не будут приняты и почему:
"use mm_store" → Оптимизатор не может удалить его, если следующие инструкции требуют регистра xmm, поэтому он генерирует нагрузку сразу после нее. Хранить + загружать ничего.
"use union" → Нарушение правила слияния, если используется два типа для одного и того же объекта. Если я хорошо понял статью, написанную Тьяго Масиейрой.