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
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users