114 lines · c
1// RUN: %clang_cc1 -x c -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse -emit-llvm -ffp-exception-behavior=strict -o - -Wall -Werror | FileCheck %s2// RUN: %clang_cc1 -x c++ -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse -emit-llvm -ffp-exception-behavior=strict -o - -Wall -Werror | FileCheck %s3 4 5#include <immintrin.h>6 7__m128 test_mm_cmpeq_ps(__m128 __a, __m128 __b) {8 // CHECK-LABEL: test_mm_cmpeq_ps9 // CHECK: [[CMP:%.*]] = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"oeq", metadata !"fpexcept.strict")10 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>11 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>12 // CHECK-NEXT: ret <4 x float> [[BC]]13 return _mm_cmpeq_ps(__a, __b);14}15 16__m128 test_mm_cmpge_ps(__m128 __a, __m128 __b) {17 // CHECK-LABEL: test_mm_cmpge_ps18 // CHECK: [[CMP:%.*]] = call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"ole", metadata !"fpexcept.strict")19 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>20 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>21 // CHECK-NEXT: ret <4 x float> [[BC]]22 return _mm_cmpge_ps(__a, __b);23}24 25__m128 test_mm_cmpgt_ps(__m128 __a, __m128 __b) {26 // CHECK-LABEL: test_mm_cmpgt_ps27 // CHECK: [[CMP:%.*]] = call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"olt", metadata !"fpexcept.strict")28 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>29 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>30 // CHECK-NEXT: ret <4 x float> [[BC]]31 return _mm_cmpgt_ps(__a, __b);32}33 34__m128 test_mm_cmple_ps(__m128 __a, __m128 __b) {35 // CHECK-LABEL: test_mm_cmple_ps36 // CHECK: [[CMP:%.*]] = call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"ole", metadata !"fpexcept.strict")37 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>38 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>39 // CHECK-NEXT: ret <4 x float> [[BC]]40 return _mm_cmple_ps(__a, __b);41}42 43__m128 test_mm_cmplt_ps(__m128 __a, __m128 __b) {44 // CHECK-LABEL: test_mm_cmplt_ps45 // CHECK: [[CMP:%.*]] = call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"olt", metadata !"fpexcept.strict")46 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>47 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>48 // CHECK-NEXT: ret <4 x float> [[BC]]49 return _mm_cmplt_ps(__a, __b);50}51 52__m128 test_mm_cmpneq_ps(__m128 __a, __m128 __b) {53 // CHECK-LABEL: test_mm_cmpneq_ps54 // CHECK: [[CMP:%.*]] = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"une", metadata !"fpexcept.strict")55 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>56 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>57 // CHECK-NEXT: ret <4 x float> [[BC]]58 return _mm_cmpneq_ps(__a, __b);59}60 61__m128 test_mm_cmpnge_ps(__m128 __a, __m128 __b) {62 // CHECK-LABEL: test_mm_cmpnge_ps63 // CHECK: [[CMP:%.*]] = call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"ugt", metadata !"fpexcept.strict")64 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>65 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>66 // CHECK-NEXT: ret <4 x float> [[BC]]67 return _mm_cmpnge_ps(__a, __b);68}69 70__m128 test_mm_cmpngt_ps(__m128 __a, __m128 __b) {71 // CHECK-LABEL: test_mm_cmpngt_ps72 // CHECK: [[CMP:%.*]] = call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"uge", metadata !"fpexcept.strict")73 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>74 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>75 // CHECK-NEXT: ret <4 x float> [[BC]]76 return _mm_cmpngt_ps(__a, __b);77}78 79__m128 test_mm_cmpnle_ps(__m128 __a, __m128 __b) {80 // CHECK-LABEL: test_mm_cmpnle_ps81 // CHECK: [[CMP:%.*]] = call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"ugt", metadata !"fpexcept.strict")82 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>83 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>84 // CHECK-NEXT: ret <4 x float> [[BC]]85 return _mm_cmpnle_ps(__a, __b);86}87 88__m128 test_mm_cmpnlt_ps(__m128 __a, __m128 __b) {89 // CHECK-LABEL: test_mm_cmpnlt_ps90 // CHECK: [[CMP:%.*]] = call <4 x i1> @llvm.experimental.constrained.fcmps.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"uge", metadata !"fpexcept.strict")91 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>92 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>93 // CHECK-NEXT: ret <4 x float> [[BC]]94 return _mm_cmpnlt_ps(__a, __b);95}96 97__m128 test_mm_cmpord_ps(__m128 __a, __m128 __b) {98 // CHECK-LABEL: test_mm_cmpord_ps99 // CHECK: [[CMP:%.*]] = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"ord", metadata !"fpexcept.strict")100 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>101 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>102 // CHECK-NEXT: ret <4 x float> [[BC]]103 return _mm_cmpord_ps(__a, __b);104}105 106__m128 test_mm_cmpunord_ps(__m128 __a, __m128 __b) {107 // CHECK-LABEL: test_mm_cmpunord_ps108 // CHECK: [[CMP:%.*]] = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(<4 x float> %{{.*}}, <4 x float> %{{.*}}, metadata !"uno", metadata !"fpexcept.strict")109 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32>110 // CHECK-NEXT: [[BC:%.*]] = bitcast <4 x i32> [[SEXT]] to <4 x float>111 // CHECK-NEXT: ret <4 x float> [[BC]]112 return _mm_cmpunord_ps(__a, __b);113}114