Quantcast
Channel: Intel® Software - Intel ISA Extensions
Viewing all articles
Browse latest Browse all 685

SSE ucomiss/comiss strange behavior

$
0
0

Hello. When I run this code :

#include <cmath> // for NAN c++11 and up
#include <iostream>
#include <xmmintrin.h>


int main(int argc, char ** argv) {

	float nan_value = NAN;

	__m128 const a = _mm_load_ss(&nan_value);
	__m128 const b = _mm_setzero_ps();

	std::cout << "gt : "<< (nan_value >  0) << std::endl;
	std::cout << "lt : "<< (nan_value <  0) << std::endl;
	std::cout << "ge : "<< (nan_value >= 0) << std::endl;
	std::cout << "le : "<< (nan_value <= 0) << std::endl;
	std::cout << "eq : "<< (nan_value == 0) << std::endl;
	std::cout << "ne : "<< (nan_value != 0) << std::endl << std::endl << std::endl;

	std::cout << "ugt : "<< _mm_ucomigt_ss(a,b) << std::endl;
	std::cout << "ult : "<< _mm_ucomilt_ss(a,b) << std::endl;
	std::cout << "uge : "<< _mm_ucomige_ss(a,b) << std::endl;
	std::cout << "ule : "<< _mm_ucomile_ss(a,b) << std::endl;
	std::cout << "ueq : "<< _mm_ucomieq_ss(a,b) << std::endl;
	std::cout << "une : "<< _mm_ucomineq_ss(a,b) << std::endl << std::endl << std::endl;

	return 0;
}

I get this output :

Which is weird because based on the documentation comigt/lt/ge/le/eq/neq should return 1 when one or both operands are NAN. Can someone shed some light on this?


Viewing all articles
Browse latest Browse all 685

Trending Articles