207
|
1 // RUN: %clang_cc1 -emit-llvm -triple x86_64-windows-pc -ffp-exception-behavior=maytrap -o - %s | FileCheck %s --check-prefixes=CHECK,FP16
|
|
2 // RUN: %clang_cc1 -emit-llvm -triple ppc64-be -ffp-exception-behavior=maytrap -o - %s | FileCheck %s --check-prefixes=CHECK,NOFP16
|
|
3
|
|
4 // test to ensure that these builtins don't do the variadic promotion of float->double.
|
|
5
|
|
6 // Test that the constrained intrinsics are picking up the exception
|
|
7 // metadata from the AST instead of the global default from the command line.
|
|
8
|
|
9 #pragma float_control(except, on)
|
|
10
|
|
11 // CHECK-LABEL: @test_half
|
|
12 void test_half(__fp16 *H, __fp16 *H2) {
|
|
13 (void)__builtin_isgreater(*H, *H2);
|
|
14 // FP16: call float @llvm.experimental.constrained.fpext.f32.f16(half %{{.*}}, metadata !"fpexcept.strict")
|
|
15 // FP16: call float @llvm.experimental.constrained.fpext.f32.f16(half %{{.*}}, metadata !"fpexcept.strict")
|
|
16 // CHECK: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"ogt", metadata !"fpexcept.strict")
|
|
17 // CHECK-NEXT: zext i1
|
|
18 (void)__builtin_isinf(*H);
|
|
19 // NOFP16: [[LDADDR:%.*]] = load i16*, i16** %{{.*}}, align 8
|
|
20 // NOFP16-NEXT: [[IHALF:%.*]] = load i16, i16* [[LDADDR]], align 2
|
|
21 // NOFP16-NEXT: [[CONV:%.*]] = call float @llvm.convert.from.fp16.f32(i16 [[IHALF]])
|
|
22 // NOFP16-NEXT: [[IFLOAT:%.*]] = bitcast float [[CONV]] to i32
|
|
23 // NOFP16-NEXT: [[SHL:%.*]] = shl i32 [[IFLOAT]], 1
|
|
24 // NOFP16-NEXT: [[RES1:%.*]] = icmp eq i32 [[SHL]], -16777216
|
|
25 // NOFP16-NEXT: zext i1 [[RES1]] to i32
|
|
26 // FP16: [[LDADDR:%.*]] = load half*, half** %{{.*}}, align 8
|
|
27 // FP16-NEXT: [[HALF:%.*]] = load half, half* [[LDADDR]], align 2
|
|
28 // FP16-NEXT: [[IHALF:%.*]] = bitcast half [[HALF]] to i16
|
|
29 // FP16-NEXT: [[SHL:%.*]] = shl i16 [[IHALF]], 1
|
|
30 // FP16-NEXT: [[RES1:%.*]] = icmp eq i16 [[SHL]], -2048
|
|
31 // FP16-NEXT: zext i1 [[RES1]] to i32
|
|
32 }
|
|
33
|
|
34 // CHECK-LABEL: @test_mixed
|
|
35 void test_mixed(double d1, float f2) {
|
|
36 (void)__builtin_isgreater(d1, f2);
|
|
37 // CHECK: [[CONV:%.*]] = call double @llvm.experimental.constrained.fpext.f64.f32(float %{{.*}}, metadata !"fpexcept.strict")
|
|
38 // CHECK-NEXT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double [[CONV]], metadata !"ogt", metadata !"fpexcept.strict")
|
|
39 // CHECK-NEXT: zext i1
|
|
40 (void)__builtin_isgreaterequal(d1, f2);
|
|
41 // CHECK: [[CONV:%.*]] = call double @llvm.experimental.constrained.fpext.f64.f32(float %{{.*}}, metadata !"fpexcept.strict")
|
|
42 // CHECK-NEXT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double [[CONV]], metadata !"oge", metadata !"fpexcept.strict")
|
|
43 // CHECK-NEXT: zext i1
|
|
44 (void)__builtin_isless(d1, f2);
|
|
45 // CHECK: [[CONV:%.*]] = call double @llvm.experimental.constrained.fpext.f64.f32(float %{{.*}}, metadata !"fpexcept.strict")
|
|
46 // CHECK-NEXT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double [[CONV]], metadata !"olt", metadata !"fpexcept.strict")
|
|
47 // CHECK-NEXT: zext i1
|
|
48 (void)__builtin_islessequal(d1, f2);
|
|
49 // CHECK: [[CONV:%.*]] = call double @llvm.experimental.constrained.fpext.f64.f32(float %{{.*}}, metadata !"fpexcept.strict")
|
|
50 // CHECK-NEXT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double [[CONV]], metadata !"ole", metadata !"fpexcept.strict")
|
|
51 // CHECK-NEXT: zext i1
|
|
52 (void)__builtin_islessgreater(d1, f2);
|
|
53 // CHECK: [[CONV:%.*]] = call double @llvm.experimental.constrained.fpext.f64.f32(float %{{.*}}, metadata !"fpexcept.strict")
|
|
54 // CHECK-NEXT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double [[CONV]], metadata !"one", metadata !"fpexcept.strict")
|
|
55 // CHECK-NEXT: zext i1
|
|
56 (void)__builtin_isunordered(d1, f2);
|
|
57 // CHECK: [[CONV:%.*]] = call double @llvm.experimental.constrained.fpext.f64.f32(float %{{.*}}, metadata !"fpexcept.strict")
|
|
58 // CHECK-NEXT: call i1 @llvm.experimental.constrained.fcmp.f64(double %{{.*}}, double [[CONV]], metadata !"uno", metadata !"fpexcept.strict")
|
|
59 // CHECK-NEXT: zext i1
|
|
60 }
|