mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 15:36:07 +00:00

These intrinsics should return the comparision result in the low bits and keep the high bits of the first source operand. When calling to builtin functions, the source operands are swapped and the high bits of the second source operand are kept. To fix the issue, an extra shufflevector is used. rdar://14153896 llvm-svn: 184110
95 lines
3.0 KiB
C
95 lines
3.0 KiB
C
// RUN: %clang_cc1 %s -O3 -triple=x86_64-apple-darwin -target-feature +avx -emit-llvm -o - | FileCheck %s
|
|
|
|
// Don't include mm_malloc.h, it's system specific.
|
|
#define __MM_MALLOC_H
|
|
|
|
#include <immintrin.h>
|
|
|
|
//
|
|
// Test LLVM IR codegen of cmpXY instructions
|
|
//
|
|
|
|
__m128d test_cmp_pd(__m128d a, __m128d b) {
|
|
// Expects that the third argument in LLVM IR is immediate expression
|
|
// CHECK: @llvm.x86.sse2.cmp.pd({{.*}}, i8 13)
|
|
return _mm_cmp_pd(a, b, _CMP_GE_OS);
|
|
}
|
|
|
|
__m128d test_cmp_ps(__m128 a, __m128 b) {
|
|
// Expects that the third argument in LLVM IR is immediate expression
|
|
// CHECK: @llvm.x86.sse.cmp.ps({{.*}}, i8 13)
|
|
return _mm_cmp_ps(a, b, _CMP_GE_OS);
|
|
}
|
|
|
|
__m256d test_cmp_pd256(__m256d a, __m256d b) {
|
|
// Expects that the third argument in LLVM IR is immediate expression
|
|
// CHECK: @llvm.x86.avx.cmp.pd.256({{.*}}, i8 13)
|
|
return _mm256_cmp_pd(a, b, _CMP_GE_OS);
|
|
}
|
|
|
|
__m256d test_cmp_ps256(__m256 a, __m256 b) {
|
|
// Expects that the third argument in LLVM IR is immediate expression
|
|
// CHECK: @llvm.x86.avx.cmp.ps.256({{.*}}, i8 13)
|
|
return _mm256_cmp_ps(a, b, _CMP_GE_OS);
|
|
}
|
|
|
|
__m128d test_cmp_sd(__m128d a, __m128d b) {
|
|
// Expects that the third argument in LLVM IR is immediate expression
|
|
// CHECK: @llvm.x86.sse2.cmp.sd({{.*}}, i8 13)
|
|
return _mm_cmp_sd(a, b, _CMP_GE_OS);
|
|
}
|
|
|
|
__m128d test_cmp_ss(__m128 a, __m128 b) {
|
|
// Expects that the third argument in LLVM IR is immediate expression
|
|
// CHECK: @llvm.x86.sse.cmp.ss({{.*}}, i8 13)
|
|
return _mm_cmp_ss(a, b, _CMP_GE_OS);
|
|
}
|
|
|
|
__m128 test_cmpgt_ss(__m128 a, __m128 b) {
|
|
// CHECK: @llvm.x86.sse.cmp.ss({{.*}}, i8 1)
|
|
// CHECK: shufflevector <{{.*}}, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
|
|
return _mm_cmpgt_ss(a, b);
|
|
}
|
|
|
|
__m128 test_cmpge_ss(__m128 a, __m128 b) {
|
|
// CHECK: @llvm.x86.sse.cmp.ss({{.*}}, i8 2)
|
|
// CHECK: shufflevector <{{.*}}, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
|
|
return _mm_cmpge_ss(a, b);
|
|
}
|
|
|
|
__m128 test_cmpngt_ss(__m128 a, __m128 b) {
|
|
// CHECK: @llvm.x86.sse.cmp.ss({{.*}}, i8 5)
|
|
// CHECK: shufflevector <{{.*}}, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
|
|
return _mm_cmpngt_ss(a, b);
|
|
}
|
|
|
|
__m128 test_cmpnge_ss(__m128 a, __m128 b) {
|
|
// CHECK: @llvm.x86.sse.cmp.ss({{.*}}, i8 6)
|
|
// CHECK: shufflevector <{{.*}}, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
|
|
return _mm_cmpnge_ss(a, b);
|
|
}
|
|
|
|
__m128d test_cmpgt_sd(__m128d a, __m128d b) {
|
|
// CHECK: @llvm.x86.sse2.cmp.sd({{.*}}, i8 1)
|
|
// CHECK: shufflevector <{{.*}}, <2 x i32> <i32 0, i32 3>
|
|
return _mm_cmpgt_sd(a, b);
|
|
}
|
|
|
|
__m128d test_cmpge_sd(__m128d a, __m128d b) {
|
|
// CHECK: @llvm.x86.sse2.cmp.sd({{.*}}, i8 2)
|
|
// CHECK: shufflevector <{{.*}}, <2 x i32> <i32 0, i32 3>
|
|
return _mm_cmpge_sd(a, b);
|
|
}
|
|
|
|
__m128d test_cmpngt_sd(__m128d a, __m128d b) {
|
|
// CHECK: @llvm.x86.sse2.cmp.sd({{.*}}, i8 5)
|
|
// CHECK: shufflevector <{{.*}}, <2 x i32> <i32 0, i32 3>
|
|
return _mm_cmpngt_sd(a, b);
|
|
}
|
|
|
|
__m128d test_cmpnge_sd(__m128d a, __m128d b) {
|
|
// CHECK: @llvm.x86.sse2.cmp.sd({{.*}}, i8 6)
|
|
// CHECK: shufflevector <{{.*}}, <2 x i32> <i32 0, i32 3>
|
|
return _mm_cmpnge_sd(a, b);
|
|
}
|