Hi,

Please find attached a short c test program which does not behave correctly
with clang 3.9.
I'm running ubuntu 16.04 64bit

clang bug.c
./a.out for gcc 5.4.0 / clang3.8 output:
1 1 0 1
1 1 0 1
./a.out for clang3.9 output:
0 0 0 0
0 0 0 0

Is that a regression?

Regards,
Christophe
#include <stdio.h>
#include <stdint.h>

typedef float __v4sf __attribute__ ((__vector_size__ (16)));
typedef double __v2df __attribute__ ((__vector_size__ (16)));


void fun32(){
	float f1 = 689.256;
	uint32_t qnan = 0x7FC10000;
	float f2 = *(float*)&qnan;
	
	int equal = __builtin_ia32_ucomieq((__v4sf) { f1, 0.0, 0.0, 0.0 }, (__v4sf) { f2, 0.0, 0.0, 0.0 });
	int lesser = __builtin_ia32_ucomilt((__v4sf) { f1, 0.0, 0.0, 0.0 }, (__v4sf) { f2, 0.0, 0.0, 0.0 });
	int greater = __builtin_ia32_ucomigt((__v4sf) { f1, 0.0, 0.0, 0.0 }, (__v4sf) { f2, 0.0, 0.0, 0.0 });
	int unordered = equal & lesser & ~greater;

	fprintf(stderr, "%d %d %d %d\n", equal, lesser, greater, unordered);
}

void fun64(){
	uint64_t ui64_1 = 0x7F80000000000000ULL; 
	uint64_t ui64_2 = 0x7FF8000000000000ULL;
	double f1 = *(double*)&ui64_1;
	double f2 = *(double*)&ui64_2;
	
	int equal = __builtin_ia32_ucomisdeq((__v2df) { f1, 0.0 }, (__v2df) { f2, 0.0 });
	int lesser = __builtin_ia32_ucomisdlt((__v2df) { f1, 0.0 }, (__v2df) { f2, 0.0 });
	int greater = __builtin_ia32_ucomisdgt((__v2df) { f1, 0.0 }, (__v2df) { f2, 0.0 });
	int unordered = equal & lesser & ~greater;
	
	fprintf(stderr, "%d %d %d %d\n", equal, lesser, greater, unordered);
}

int main(){

	fun32();
	fun64();
		
	return 0;
}
_______________________________________________
cfe-users mailing list
cfe-users@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users

Reply via email to