133 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 52// RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-- -target-feature +avx -disable-O0-optnone -emit-llvm -o - | opt -S -passes=mem2reg | FileCheck %s3// RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=i386-- -target-feature +avx -disable-O0-optnone -emit-llvm -o - | opt -S -passes=mem2reg | FileCheck %s4 5 6#include <immintrin.h>7 8//9// Test LLVM IR codegen of cmpXY instructions10//11 12// CHECK-LABEL: define dso_local <2 x double> @test_cmp_sd(13// CHECK-SAME: <2 x double> noundef [[A:%.*]], <2 x double> noundef [[B:%.*]]) #[[ATTR0:[0-9]+]] {14// CHECK-NEXT: [[ENTRY:.*:]]15// CHECK-NEXT: [[TMP0:%.*]] = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> [[A]], <2 x double> [[B]], i8 13)16// CHECK-NEXT: ret <2 x double> [[TMP0]]17//18__m128d test_cmp_sd(__m128d a, __m128d b) {19 // Expects that the third argument in LLVM IR is immediate expression20 return _mm_cmp_sd(a, b, _CMP_GE_OS);21}22 23// CHECK-LABEL: define dso_local <4 x float> @test_cmp_ss(24// CHECK-SAME: <4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) #[[ATTR0]] {25// CHECK-NEXT: [[ENTRY:.*:]]26// CHECK-NEXT: [[TMP0:%.*]] = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> [[A]], <4 x float> [[B]], i8 13)27// CHECK-NEXT: ret <4 x float> [[TMP0]]28//29__m128 test_cmp_ss(__m128 a, __m128 b) {30 // Expects that the third argument in LLVM IR is immediate expression31 return _mm_cmp_ss(a, b, _CMP_GE_OS);32}33 34// CHECK-LABEL: define dso_local <4 x float> @test_cmpgt_ss(35// CHECK-SAME: <4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) #[[ATTR0]] {36// CHECK-NEXT: [[ENTRY:.*:]]37// CHECK-NEXT: [[TMP0:%.*]] = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> [[B]], <4 x float> [[A]], i8 1)38// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[TMP0]], <4 x i32> <i32 4, i32 1, i32 2, i32 3>39// CHECK-NEXT: ret <4 x float> [[SHUFFLE_I]]40//41__m128 test_cmpgt_ss(__m128 a, __m128 b) {42 return _mm_cmpgt_ss(a, b);43}44 45// CHECK-LABEL: define dso_local <4 x float> @test_cmpge_ss(46// CHECK-SAME: <4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) #[[ATTR0]] {47// CHECK-NEXT: [[ENTRY:.*:]]48// CHECK-NEXT: [[TMP0:%.*]] = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> [[B]], <4 x float> [[A]], i8 2)49// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[TMP0]], <4 x i32> <i32 4, i32 1, i32 2, i32 3>50// CHECK-NEXT: ret <4 x float> [[SHUFFLE_I]]51//52__m128 test_cmpge_ss(__m128 a, __m128 b) {53 return _mm_cmpge_ss(a, b);54}55 56// CHECK-LABEL: define dso_local <4 x float> @test_cmpngt_ss(57// CHECK-SAME: <4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) #[[ATTR0]] {58// CHECK-NEXT: [[ENTRY:.*:]]59// CHECK-NEXT: [[TMP0:%.*]] = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> [[B]], <4 x float> [[A]], i8 5)60// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[TMP0]], <4 x i32> <i32 4, i32 1, i32 2, i32 3>61// CHECK-NEXT: ret <4 x float> [[SHUFFLE_I]]62//63__m128 test_cmpngt_ss(__m128 a, __m128 b) {64 return _mm_cmpngt_ss(a, b);65}66 67// CHECK-LABEL: define dso_local <4 x float> @test_cmpnge_ss(68// CHECK-SAME: <4 x float> noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) #[[ATTR0]] {69// CHECK-NEXT: [[ENTRY:.*:]]70// CHECK-NEXT: [[TMP0:%.*]] = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> [[B]], <4 x float> [[A]], i8 6)71// CHECK-NEXT: [[SHUFFLE_I:%.*]] = shufflevector <4 x float> [[A]], <4 x float> [[TMP0]], <4 x i32> <i32 4, i32 1, i32 2, i32 3>72// CHECK-NEXT: ret <4 x float> [[SHUFFLE_I]]73//74__m128 test_cmpnge_ss(__m128 a, __m128 b) {75 return _mm_cmpnge_ss(a, b);76}77 78// CHECK-LABEL: define dso_local <2 x double> @test_cmpgt_sd(79// CHECK-SAME: <2 x double> noundef [[A:%.*]], <2 x double> noundef [[B:%.*]]) #[[ATTR0]] {80// CHECK-NEXT: [[ENTRY:.*:]]81// CHECK-NEXT: [[TMP0:%.*]] = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> [[B]], <2 x double> [[A]], i8 1)82// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x double> [[TMP0]], i32 083// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <2 x double> poison, double [[VECEXT_I]], i32 084// CHECK-NEXT: [[VECEXT1_I:%.*]] = extractelement <2 x double> [[A]], i32 185// CHECK-NEXT: [[VECINIT2_I:%.*]] = insertelement <2 x double> [[VECINIT_I]], double [[VECEXT1_I]], i32 186// CHECK-NEXT: ret <2 x double> [[VECINIT2_I]]87//88__m128d test_cmpgt_sd(__m128d a, __m128d b) {89 return _mm_cmpgt_sd(a, b);90}91 92// CHECK-LABEL: define dso_local <2 x double> @test_cmpge_sd(93// CHECK-SAME: <2 x double> noundef [[A:%.*]], <2 x double> noundef [[B:%.*]]) #[[ATTR0]] {94// CHECK-NEXT: [[ENTRY:.*:]]95// CHECK-NEXT: [[TMP0:%.*]] = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> [[B]], <2 x double> [[A]], i8 2)96// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x double> [[TMP0]], i32 097// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <2 x double> poison, double [[VECEXT_I]], i32 098// CHECK-NEXT: [[VECEXT1_I:%.*]] = extractelement <2 x double> [[A]], i32 199// CHECK-NEXT: [[VECINIT2_I:%.*]] = insertelement <2 x double> [[VECINIT_I]], double [[VECEXT1_I]], i32 1100// CHECK-NEXT: ret <2 x double> [[VECINIT2_I]]101//102__m128d test_cmpge_sd(__m128d a, __m128d b) {103 return _mm_cmpge_sd(a, b);104}105 106// CHECK-LABEL: define dso_local <2 x double> @test_cmpngt_sd(107// CHECK-SAME: <2 x double> noundef [[A:%.*]], <2 x double> noundef [[B:%.*]]) #[[ATTR0]] {108// CHECK-NEXT: [[ENTRY:.*:]]109// CHECK-NEXT: [[TMP0:%.*]] = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> [[B]], <2 x double> [[A]], i8 5)110// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x double> [[TMP0]], i32 0111// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <2 x double> poison, double [[VECEXT_I]], i32 0112// CHECK-NEXT: [[VECEXT1_I:%.*]] = extractelement <2 x double> [[A]], i32 1113// CHECK-NEXT: [[VECINIT2_I:%.*]] = insertelement <2 x double> [[VECINIT_I]], double [[VECEXT1_I]], i32 1114// CHECK-NEXT: ret <2 x double> [[VECINIT2_I]]115//116__m128d test_cmpngt_sd(__m128d a, __m128d b) {117 return _mm_cmpngt_sd(a, b);118}119 120// CHECK-LABEL: define dso_local <2 x double> @test_cmpnge_sd(121// CHECK-SAME: <2 x double> noundef [[A:%.*]], <2 x double> noundef [[B:%.*]]) #[[ATTR0]] {122// CHECK-NEXT: [[ENTRY:.*:]]123// CHECK-NEXT: [[TMP0:%.*]] = call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> [[B]], <2 x double> [[A]], i8 6)124// CHECK-NEXT: [[VECEXT_I:%.*]] = extractelement <2 x double> [[TMP0]], i32 0125// CHECK-NEXT: [[VECINIT_I:%.*]] = insertelement <2 x double> poison, double [[VECEXT_I]], i32 0126// CHECK-NEXT: [[VECEXT1_I:%.*]] = extractelement <2 x double> [[A]], i32 1127// CHECK-NEXT: [[VECINIT2_I:%.*]] = insertelement <2 x double> [[VECINIT_I]], double [[VECEXT1_I]], i32 1128// CHECK-NEXT: ret <2 x double> [[VECINIT2_I]]129//130__m128d test_cmpnge_sd(__m128d a, __m128d b) {131 return _mm_cmpnge_sd(a, b);132}133