// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py // REQUIRES: colossus-registered-target // RUN: %clang_cc1 %s -emit-llvm -ffp-exception-behavior=maytrap -o - -triple colossus-unknown-unknown | FileCheck %s #pragma float_control(except, on) // CHECK-LABEL: @test_isnan_float( // CHECK-NEXT: entry: // CHECK-NEXT: [[F_ADDR:%.*]] = alloca float, align 4 // CHECK-NEXT: store float [[F:%.*]], ptr [[F_ADDR]], align 4 // CHECK-NEXT: [[TMP:%.*]] = load float, ptr [[F_ADDR]], align 4 // CHECK-NEXT: [[CLS:%.*]] = call i32 @llvm.colossus.f32class(float [[TMP]]) [[ATTR2:#.*]] // CHECK-NEXT: [[ISNAN:%.*]] = icmp ule i32 [[CLS]], 2 // CHECK-NEXT: [[RES:%.*]] = zext i1 [[ISNAN]] to i32 // CHECK-NEXT: ret i32 [[RES]] // int test_isnan_float(float f) { return __builtin_isnan(f); } // CHECK-LABEL: @test_isinf_float( // CHECK-NEXT: entry: // CHECK-NEXT: [[F_ADDR:%.*]] = alloca float, align 4 // CHECK-NEXT: store float [[F:%.*]], ptr [[F_ADDR]], align 4 // CHECK-NEXT: [[TMP:%.*]] = load float, ptr [[F_ADDR]], align 4 // CHECK-NEXT: [[CLS:%.*]] = call i32 @llvm.colossus.f32class(float [[TMP]]) [[ATTR2:#.*]] // CHECK-NEXT: [[IS3:%.*]] = icmp eq i32 [[CLS]], 3 // CHECK-NEXT: [[IS4:%.*]] = icmp eq i32 [[CLS]], 4 // CHECK-NEXT: [[ISINF:%.*]] = or i1 [[IS3]], [[IS4]] // CHECK-NEXT: [[RES:%.*]] = zext i1 [[ISINF]] to i32 // CHECK-NEXT: ret i32 [[RES]] // int test_isinf_float(float f) { return __builtin_isinf(f); } // CHECK-LABEL: @test_isfinite_float( // CHECK-NEXT: entry: // CHECK-NEXT: [[F_ADDR:%.*]] = alloca float, align 4 // CHECK-NEXT: store float [[F:%.*]], ptr [[F_ADDR]], align 4 // CHECK-NEXT: [[TMP:%.*]] = load float, ptr [[F_ADDR]], align 4 // CHECK-NEXT: [[CLS:%.*]] = call i32 @llvm.colossus.f32class(float [[TMP]]) [[ATTR2:#.*]] // CHECK-NEXT: [[ISFINITE:%.*]] = icmp uge i32 [[CLS]], 5 // CHECK-NEXT: [[RES:%.*]] = zext i1 [[ISFINITE]] to i32 // CHECK-NEXT: ret i32 [[RES]] // int test_isfinite_float(float f) { return __builtin_isfinite(f); }