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