179 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 62// RUN: %clang_cc1 -triple aarch64-linux-gnu -O1 -emit-llvm %s -o - | FileCheck %s3 4// CHECK-LABEL: define dso_local noundef i1 @check_isfpclass_finite(5// CHECK-SAME: float noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {6// CHECK-NEXT: [[ENTRY:.*:]]7// CHECK-NEXT: [[TMP0:%.*]] = tail call float @llvm.fabs.f32(float [[X]])8// CHECK-NEXT: [[TMP1:%.*]] = fcmp one float [[TMP0]], 0x7FF00000000000009// CHECK-NEXT: ret i1 [[TMP1]]10//11_Bool check_isfpclass_finite(float x) {12 return __builtin_isfpclass(x, 504 /*Finite*/);13}14 15// CHECK-LABEL: define dso_local noundef i1 @check_isfpclass_finite_strict(16// CHECK-SAME: float noundef [[X:%.*]]) local_unnamed_addr #[[ATTR2:[0-9]+]] {17// CHECK-NEXT: [[ENTRY:.*:]]18// CHECK-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.is.fpclass.f32(float [[X]], i32 504) #[[ATTR5:[0-9]+]]19// CHECK-NEXT: ret i1 [[TMP0]]20//21_Bool check_isfpclass_finite_strict(float x) {22#pragma STDC FENV_ACCESS ON23 return __builtin_isfpclass(x, 504 /*Finite*/);24}25 26// CHECK-LABEL: define dso_local noundef i1 @check_isfpclass_nan_f32(27// CHECK-SAME: float noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {28// CHECK-NEXT: [[ENTRY:.*:]]29// CHECK-NEXT: [[TMP0:%.*]] = fcmp uno float [[X]], 0.000000e+0030// CHECK-NEXT: ret i1 [[TMP0]]31//32_Bool check_isfpclass_nan_f32(float x) {33 return __builtin_isfpclass(x, 3 /*NaN*/);34}35 36// CHECK-LABEL: define dso_local noundef i1 @check_isfpclass_nan_f32_strict(37// CHECK-SAME: float noundef [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {38// CHECK-NEXT: [[ENTRY:.*:]]39// CHECK-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.is.fpclass.f32(float [[X]], i32 3) #[[ATTR5]]40// CHECK-NEXT: ret i1 [[TMP0]]41//42_Bool check_isfpclass_nan_f32_strict(float x) {43#pragma STDC FENV_ACCESS ON44 return __builtin_isfpclass(x, 3 /*NaN*/);45}46 47// CHECK-LABEL: define dso_local noundef i1 @check_isfpclass_snan_f64(48// CHECK-SAME: double noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {49// CHECK-NEXT: [[ENTRY:.*:]]50// CHECK-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.is.fpclass.f64(double [[X]], i32 1)51// CHECK-NEXT: ret i1 [[TMP0]]52//53_Bool check_isfpclass_snan_f64(double x) {54 return __builtin_isfpclass(x, 1 /*SNaN*/);55}56 57// CHECK-LABEL: define dso_local noundef i1 @check_isfpclass_snan_f64_strict(58// CHECK-SAME: double noundef [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {59// CHECK-NEXT: [[ENTRY:.*:]]60// CHECK-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.is.fpclass.f64(double [[X]], i32 1) #[[ATTR5]]61// CHECK-NEXT: ret i1 [[TMP0]]62//63_Bool check_isfpclass_snan_f64_strict(double x) {64#pragma STDC FENV_ACCESS ON65 return __builtin_isfpclass(x, 1 /*NaN*/);66}67 68// CHECK-LABEL: define dso_local noundef i1 @check_isfpclass_zero_f16(69// CHECK-SAME: half noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {70// CHECK-NEXT: [[ENTRY:.*:]]71// CHECK-NEXT: [[TMP0:%.*]] = fcmp oeq half [[X]], 0xH000072// CHECK-NEXT: ret i1 [[TMP0]]73//74_Bool check_isfpclass_zero_f16(_Float16 x) {75 return __builtin_isfpclass(x, 96 /*Zero*/);76}77 78// CHECK-LABEL: define dso_local noundef i1 @check_isfpclass_zero_f16_strict(79// CHECK-SAME: half noundef [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {80// CHECK-NEXT: [[ENTRY:.*:]]81// CHECK-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.is.fpclass.f16(half [[X]], i32 96) #[[ATTR5]]82// CHECK-NEXT: ret i1 [[TMP0]]83//84_Bool check_isfpclass_zero_f16_strict(_Float16 x) {85#pragma STDC FENV_ACCESS ON86 return __builtin_isfpclass(x, 96 /*Zero*/);87}88 89// CHECK-LABEL: define dso_local noundef i1 @check_isnan(90// CHECK-SAME: float noundef [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {91// CHECK-NEXT: [[ENTRY:.*:]]92// CHECK-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.is.fpclass.f32(float [[X]], i32 3) #[[ATTR5]]93// CHECK-NEXT: ret i1 [[TMP0]]94//95_Bool check_isnan(float x) {96#pragma STDC FENV_ACCESS ON97 return __builtin_isnan(x);98}99 100// CHECK-LABEL: define dso_local noundef i1 @check_isinf(101// CHECK-SAME: float noundef [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {102// CHECK-NEXT: [[ENTRY:.*:]]103// CHECK-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.is.fpclass.f32(float [[X]], i32 516) #[[ATTR5]]104// CHECK-NEXT: ret i1 [[TMP0]]105//106_Bool check_isinf(float x) {107#pragma STDC FENV_ACCESS ON108 return __builtin_isinf(x);109}110 111// CHECK-LABEL: define dso_local noundef i1 @check_isfinite(112// CHECK-SAME: float noundef [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {113// CHECK-NEXT: [[ENTRY:.*:]]114// CHECK-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.is.fpclass.f32(float [[X]], i32 504) #[[ATTR5]]115// CHECK-NEXT: ret i1 [[TMP0]]116//117_Bool check_isfinite(float x) {118#pragma STDC FENV_ACCESS ON119 return __builtin_isfinite(x);120}121 122// CHECK-LABEL: define dso_local noundef i1 @check_isnormal(123// CHECK-SAME: float noundef [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {124// CHECK-NEXT: [[ENTRY:.*:]]125// CHECK-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.is.fpclass.f32(float [[X]], i32 264) #[[ATTR5]]126// CHECK-NEXT: ret i1 [[TMP0]]127//128_Bool check_isnormal(float x) {129#pragma STDC FENV_ACCESS ON130 return __builtin_isnormal(x);131}132 133 134typedef float __attribute__((ext_vector_type(4))) float4;135typedef double __attribute__((ext_vector_type(4))) double4;136typedef int __attribute__((ext_vector_type(4))) int4;137typedef long __attribute__((ext_vector_type(4))) long4;138 139// CHECK-LABEL: define dso_local range(i32 0, 2) <4 x i32> @check_isfpclass_nan_v4f32(140// CHECK-SAME: <4 x float> noundef [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {141// CHECK-NEXT: [[ENTRY:.*:]]142// CHECK-NEXT: [[TMP0:%.*]] = fcmp uno <4 x float> [[X]], zeroinitializer143// CHECK-NEXT: [[TMP1:%.*]] = zext <4 x i1> [[TMP0]] to <4 x i32>144// CHECK-NEXT: ret <4 x i32> [[TMP1]]145//146int4 check_isfpclass_nan_v4f32(float4 x) {147 return __builtin_isfpclass(x, 3 /*NaN*/);148}149 150// CHECK-LABEL: define dso_local range(i32 0, 2) <4 x i32> @check_isfpclass_nan_strict_v4f32(151// CHECK-SAME: <4 x float> noundef [[X:%.*]]) local_unnamed_addr #[[ATTR2]] {152// CHECK-NEXT: [[ENTRY:.*:]]153// CHECK-NEXT: [[TMP0:%.*]] = tail call <4 x i1> @llvm.is.fpclass.v4f32(<4 x float> [[X]], i32 3) #[[ATTR5]]154// CHECK-NEXT: [[TMP1:%.*]] = zext <4 x i1> [[TMP0]] to <4 x i32>155// CHECK-NEXT: ret <4 x i32> [[TMP1]]156//157int4 check_isfpclass_nan_strict_v4f32(float4 x) {158#pragma STDC FENV_ACCESS ON159 return __builtin_isfpclass(x, 3 /*NaN*/);160}161 162// CHECK-LABEL: define dso_local void @check_isfpclass_nan_v4f64(163// CHECK-SAME: ptr dead_on_unwind noalias writable writeonly sret(<4 x i64>) align 16 captures(none) initializes((0, 32)) [[AGG_RESULT:%.*]], ptr dead_on_return noundef readonly captures(none) [[TMP0:%.*]]) local_unnamed_addr #[[ATTR3:[0-9]+]] {164// CHECK-NEXT: [[ENTRY:.*:]]165// CHECK-NEXT: [[X:%.*]] = load <4 x double>, ptr [[TMP0]], align 16, !tbaa [[CHAR_TBAA6:![0-9]+]]166// CHECK-NEXT: [[TMP1:%.*]] = fcmp uno <4 x double> [[X]], zeroinitializer167// CHECK-NEXT: [[TMP2:%.*]] = zext <4 x i1> [[TMP1]] to <4 x i64>168// CHECK-NEXT: store <4 x i64> [[TMP2]], ptr [[AGG_RESULT]], align 16, !tbaa [[CHAR_TBAA6]]169// CHECK-NEXT: ret void170//171long4 check_isfpclass_nan_v4f64(double4 x) {172 return __builtin_isfpclass(x, 3 /*NaN*/);173}174//.175// CHECK: [[META4:![0-9]+]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0}176// CHECK: [[META5]] = !{!"Simple C/C++ TBAA"}177// CHECK: [[CHAR_TBAA6]] = !{[[META4]], [[META4]], i64 0}178//.179