11// RUN: %clang_cc1 -triple=aarch64-gnu-linux -emit-llvm -O1 %s -o - | FileCheck --check-prefix=NO-MATH-ERRNO %s
22// RUN: %clang_cc1 -triple=aarch64-gnu-linux -emit-llvm -fmath-errno %s -o - | FileCheck --check-prefix=MATH-ERRNO %s
3+ // RUN: %clang_cc1 -triple=aarch64-gnu-linux -emit-llvm -ffp-exception-behavior=strict %s -o - | FileCheck --check-prefix=STRICT-FP %s
4+
5+ void sincos (double , double * , double * );
6+ void sincosf (float , float * , float * );
7+ void sincosl (long double , long double * , long double * );
38
49// NO-MATH-ERRNO-LABEL: @sincos_f32
510// NO-MATH-ERRNO: [[SINCOS:%.*]] = tail call { float, float } @llvm.sincos.f32(float {{.*}})
1116// MATH-ERRNO-LABEL: @sincos_f32
1217// MATH-ERRNO: call void @sincosf(
1318//
19+ // STRICT-FP-LABEL: @sincos_f32
20+ // STRICT-FP: call void @sincosf(
21+ //
1422void sincos_f32 (float x , float * fp0 , float * fp1 ) {
23+ sincosf (x , fp0 , fp1 );
24+ }
25+
26+ // NO-MATH-ERRNO-LABEL: @sincos_builtin_f32
27+ // NO-MATH-ERRNO: [[SINCOS:%.*]] = tail call { float, float } @llvm.sincos.f32(float {{.*}})
28+ // NO-MATH-ERRNO-NEXT: [[SIN:%.*]] = extractvalue { float, float } [[SINCOS]], 0
29+ // NO-MATH-ERRNO-NEXT: [[COS:%.*]] = extractvalue { float, float } [[SINCOS]], 1
30+ // NO-MATH-ERRNO-NEXT: store float [[SIN]], ptr {{.*}}, align 4, !alias.scope [[SINCOS_ALIAS_SCOPE:![0-9]+]]
31+ // NO-MATH-ERRNO-NEXT: store float [[COS]], ptr {{.*}}, align 4, !noalias [[SINCOS_ALIAS_SCOPE]]
32+ //
33+ // MATH-ERRNO-LABEL: @sincos_builtin_f32
34+ // MATH-ERRNO: call void @sincosf(
35+ //
36+ void sincos_builtin_f32 (float x , float * fp0 , float * fp1 ) {
1537 __builtin_sincosf (x , fp0 , fp1 );
1638}
1739
@@ -25,7 +47,24 @@ void sincos_f32(float x, float* fp0, float* fp1) {
2547// MATH-ERRNO-LABEL: @sincos_f64
2648// MATH-ERRNO: call void @sincos(
2749//
50+ // STRICT-FP-LABEL: @sincos_f64
51+ // STRICT-FP: call void @sincos(
52+ //
2853void sincos_f64 (double x , double * dp0 , double * dp1 ) {
54+ sincos (x , dp0 , dp1 );
55+ }
56+
57+ // NO-MATH-ERRNO-LABEL: @sincos_builtin_f64
58+ // NO-MATH-ERRNO: [[SINCOS:%.*]] = tail call { double, double } @llvm.sincos.f64(double {{.*}})
59+ // NO-MATH-ERRNO-NEXT: [[SIN:%.*]] = extractvalue { double, double } [[SINCOS]], 0
60+ // NO-MATH-ERRNO-NEXT: [[COS:%.*]] = extractvalue { double, double } [[SINCOS]], 1
61+ // NO-MATH-ERRNO-NEXT: store double [[SIN]], ptr {{.*}}, align 8, !alias.scope [[SINCOS_ALIAS_SCOPE:![0-9]+]]
62+ // NO-MATH-ERRNO-NEXT: store double [[COS]], ptr {{.*}}, align 8, !noalias [[SINCOS_ALIAS_SCOPE]]
63+ //
64+ // MATH-ERRNO-LABEL: @sincos_builtin_f64
65+ // MATH-ERRNO: call void @sincos(
66+ //
67+ void sincos_builtin_f64 (double x , double * dp0 , double * dp1 ) {
2968 __builtin_sincos (x , dp0 , dp1 );
3069}
3170
@@ -39,6 +78,23 @@ void sincos_f64(double x, double* dp0, double* dp1) {
3978// MATH-ERRNO-LABEL: @sincos_f128
4079// MATH-ERRNO: call void @sincosl(
4180//
81+ // STRICT-FP-LABEL: @sincos_f128
82+ // STRICT-FP: call void @sincosl(
83+ //
4284void sincos_f128 (long double x , long double * ldp0 , long double * ldp1 ) {
85+ sincosl (x , ldp0 , ldp1 );
86+ }
87+
88+ // NO-MATH-ERRNO-LABEL: @sincos_builtin_f128
89+ // NO-MATH-ERRNO: [[SINCOS:%.*]] = tail call { fp128, fp128 } @llvm.sincos.f128(fp128 {{.*}})
90+ // NO-MATH-ERRNO-NEXT: [[SIN:%.*]] = extractvalue { fp128, fp128 } [[SINCOS]], 0
91+ // NO-MATH-ERRNO-NEXT: [[COS:%.*]] = extractvalue { fp128, fp128 } [[SINCOS]], 1
92+ // NO-MATH-ERRNO-NEXT: store fp128 [[SIN]], ptr {{.*}}, align 16, !alias.scope [[SINCOS_ALIAS_SCOPE:![0-9]+]]
93+ // NO-MATH-ERRNO-NEXT: store fp128 [[COS]], ptr {{.*}}, align 16, !noalias [[SINCOS_ALIAS_SCOPE]]
94+ //
95+ // MATH-ERRNO-LABEL: @sincos_builtin_f128
96+ // MATH-ERRNO: call void @sincosl(
97+ //
98+ void sincos_builtin_f128 (long double x , long double * ldp0 , long double * ldp1 ) {
4399 __builtin_sincosl (x , ldp0 , ldp1 );
44100}
0 commit comments