Я довольно плохо знаком с внутренностями и столкнулся с разным поведением моего кода в GCC-7.4 и GCC-8.3
Мой код довольно прост
b.cpp:
#include <iostream>
#include <xmmintrin.h>
void foo(const float num, const float denom)
{
const __v4sf num4 = {
num,
num,
num,
num,
};
const __v4sf denom4 = {
denom,
denom,
denom,
denom,
};
float res_arr[] = {0, 0, 0, 0};
__v4sf *res = (__v4sf*)res_arr;
*res = num4 / denom4;
std::cout << res_arr[0] << std::endl;
std::cout << res_arr[1] << std::endl;
std::cout << res_arr[2] << std::endl;
std::cout << res_arr[3] << std::endl;
}
В b.cpp мы просто строим два __v4sf
из переменных с плавающей запятой и выполняем деление
b.h:
#ifndef B_H
#define B_H
void foo(const float num, const float denom);
#endif
a.cpp:
#include "b.h"
int main (void)
{
const float denominator = 1.0f;
const float numerator = 12.0f;
foo(numerator, denominator);
return 0;
}
Здесь мы просто вызываем нашу функцию из b.cpp
GCC 7.4 работает нормально:
g++-7 -c b.cpp -o b.o && g++-7 a.cpp b.o -o a.out && ./a.out
12
12
12
12
Но что-то не так с GCC 8.3
g++-8 -c b.cpp -o b.o && g++-8 a.cpp b.o -o a.out && ./a.out
inf
inf
inf
inf
Итак, мой вопрос - почему я получаю разные результаты с разными версиями GCC? Это неопределенное поведение?