1
- // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2
1
// RUN: %clang_cc1 %s -emit-llvm -ffp-exception-behavior=maytrap -fexperimental-strict-floating-point -o - -triple arm64-none-linux-gnu | FileCheck %s
3
2
4
3
// Test that the constrained intrinsics are picking up the exception
@@ -16,7 +15,7 @@ int printf(const char *, ...);
16
15
// CHECK-NEXT: store i32 [[X:%.*]], i32* [[X_ADDR]], align 4
17
16
// CHECK-NEXT: [[TMP0:%.*]] = load i8*, i8** [[STR_ADDR]], align 8
18
17
// CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[X_ADDR]], align 4
19
- // CHECK-NEXT: [[CALL:%.*]] = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0), i8* [[TMP0]], i32 [[TMP1]]) #[[ATTR3:[0-9]+ ]]
18
+ // CHECK-NEXT: [[CALL:%.*]] = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0), i8* [[TMP0]], i32 [[TMP1]]) [[ATTR4:#.* ]]
20
19
// CHECK-NEXT: ret void
21
20
//
22
21
void p (char * str , int x ) {
@@ -28,13 +27,13 @@ void p(char *str, int x) {
28
27
// CHECK-LABEL: @test_long_double_isinf(
29
28
// CHECK-NEXT: entry:
30
29
// CHECK-NEXT: [[LD_ADDR:%.*]] = alloca fp128, align 16
31
- // CHECK-NEXT: store fp128 [[LD :%.*]], fp128* [[LD_ADDR]], align 16
30
+ // CHECK-NEXT: store fp128 [[D :%.*]], fp128* [[LD_ADDR]], align 16
32
31
// CHECK-NEXT: [[TMP0:%.*]] = load fp128, fp128* [[LD_ADDR]], align 16
33
- // CHECK-NEXT: [[TMP1 :%.*]] = bitcast fp128 [[TMP0]] to i128
34
- // CHECK-NEXT: [[TMP2 :%.*]] = shl i128 [[TMP1 ]], 1
35
- // CHECK-NEXT: [[TMP3 :%.*]] = icmp eq i128 [[TMP2 ]], -10384593717069655257060992658440192
36
- // CHECK-NEXT: [[TMP4 :%.*]] = zext i1 [[TMP3 ]] to i32
37
- // CHECK-NEXT: call void @p(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1 , i64 0, i64 0), i32 [[TMP4 ]]) #[[ATTR3 ]]
32
+ // CHECK-NEXT: [[BITCAST :%.*]] = bitcast fp128 [[TMP0]] to i128
33
+ // CHECK-NEXT: [[SHL1 :%.*]] = shl i128 [[BITCAST ]], 1
34
+ // CHECK-NEXT: [[CMP :%.*]] = icmp eq i128 [[SHL1 ]], -10384593717069655257060992658440192
35
+ // CHECK-NEXT: [[RES :%.*]] = zext i1 [[CMP ]] to i32
36
+ // CHECK-NEXT: call void @p(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.[[#STRID:1]] , i64 0, i64 0), i32 [[RES ]]) [[ATTR4 ]]
38
37
// CHECK-NEXT: ret void
39
38
//
40
39
void test_long_double_isinf (long double ld ) {
@@ -46,13 +45,13 @@ void test_long_double_isinf(long double ld) {
46
45
// CHECK-LABEL: @test_long_double_isfinite(
47
46
// CHECK-NEXT: entry:
48
47
// CHECK-NEXT: [[LD_ADDR:%.*]] = alloca fp128, align 16
49
- // CHECK-NEXT: store fp128 [[LD :%.*]], fp128* [[LD_ADDR]], align 16
48
+ // CHECK-NEXT: store fp128 [[D :%.*]], fp128* [[LD_ADDR]], align 16
50
49
// CHECK-NEXT: [[TMP0:%.*]] = load fp128, fp128* [[LD_ADDR]], align 16
51
- // CHECK-NEXT: [[TMP1 :%.*]] = bitcast fp128 [[TMP0]] to i128
52
- // CHECK-NEXT: [[TMP2 :%.*]] = shl i128 [[TMP1 ]], 1
53
- // CHECK-NEXT: [[TMP3 :%.*]] = icmp ult i128 [[TMP2 ]], -10384593717069655257060992658440192
54
- // CHECK-NEXT: [[TMP4 :%.*]] = zext i1 [[TMP3 ]] to i32
55
- // CHECK-NEXT: call void @p(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.2 , i64 0, i64 0), i32 [[TMP4 ]]) #[[ATTR3 ]]
50
+ // CHECK-NEXT: [[BITCAST :%.*]] = bitcast fp128 [[TMP0]] to i128
51
+ // CHECK-NEXT: [[SHL1 :%.*]] = shl i128 [[BITCAST ]], 1
52
+ // CHECK-NEXT: [[CMP :%.*]] = icmp ult i128 [[SHL1 ]], -10384593717069655257060992658440192
53
+ // CHECK-NEXT: [[RES :%.*]] = zext i1 [[CMP ]] to i32
54
+ // CHECK-NEXT: call void @p(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.[[#STRID:STRID+1]] , i64 0, i64 0), i32 [[RES ]]) [[ATTR4 ]]
56
55
// CHECK-NEXT: ret void
57
56
//
58
57
void test_long_double_isfinite (long double ld ) {
@@ -64,11 +63,14 @@ void test_long_double_isfinite(long double ld) {
64
63
// CHECK-LABEL: @test_long_double_isnan(
65
64
// CHECK-NEXT: entry:
66
65
// CHECK-NEXT: [[LD_ADDR:%.*]] = alloca fp128, align 16
67
- // CHECK-NEXT: store fp128 [[LD :%.*]], fp128* [[LD_ADDR]], align 16
66
+ // CHECK-NEXT: store fp128 [[D :%.*]], fp128* [[LD_ADDR]], align 16
68
67
// CHECK-NEXT: [[TMP0:%.*]] = load fp128, fp128* [[LD_ADDR]], align 16
69
- // CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.isnan.f128(fp128 [[TMP0]]) #[[ATTR3]]
70
- // CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32
71
- // CHECK-NEXT: call void @p(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i64 0, i64 0), i32 [[TMP2]]) #[[ATTR3]]
68
+ // CHECK-NEXT: [[BITCAST:%.*]] = bitcast fp128 [[TMP0]] to i128
69
+ // CHECK-NEXT: [[ABS:%.*]] = and i128 [[BITCAST]], 170141183460469231731687303715884105727
70
+ // CHECK-NEXT: [[TMP1:%.*]] = sub i128 170135991163610696904058773219554885632, [[ABS]]
71
+ // CHECK-NEXT: [[ISNAN:%.*]] = lshr i128 [[TMP1]], 127
72
+ // CHECK-NEXT: [[RES:%.*]] = trunc i128 [[ISNAN]] to i32
73
+ // CHECK-NEXT: call void @p(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.[[#STRID:STRID+1]], i64 0, i64 0), i32 [[RES]])
72
74
// CHECK-NEXT: ret void
73
75
//
74
76
void test_long_double_isnan (long double ld ) {
0 commit comments