diff options
Diffstat (limited to 'clang/test/CodeGen')
| -rw-r--r-- | clang/test/CodeGen/AArch64/neon-fcvt-intrinsics.c | 205 | ||||
| -rw-r--r-- | clang/test/CodeGen/AArch64/v9.6a-neon-f16-intrinsics.c | 23 | ||||
| -rw-r--r-- | clang/test/CodeGen/AArch64/v9.6a-neon-f32-intrinsics.c | 21 |
3 files changed, 247 insertions, 2 deletions
diff --git a/clang/test/CodeGen/AArch64/neon-fcvt-intrinsics.c b/clang/test/CodeGen/AArch64/neon-fcvt-intrinsics.c index 670b650..929df94 100644 --- a/clang/test/CodeGen/AArch64/neon-fcvt-intrinsics.c +++ b/clang/test/CodeGen/AArch64/neon-fcvt-intrinsics.c @@ -26,16 +26,36 @@ int32_t test_vcvtas_s32_f32(float32_t a) { return (int32_t)vcvtas_s32_f32(a); } -// CHECK-LABEL: define {{[^@]+}}@test_test_vcvtad_s64_f64 +// CHECK-LABEL: define {{[^@]+}}@test_vcvtad_s64_f64 // CHECK-SAME: (double noundef [[A:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: // CHECK-NEXT: [[VCVTAD_S64_F64_I:%.*]] = call i64 @llvm.aarch64.neon.fcvtas.i64.f64(double [[A]]) // CHECK-NEXT: ret i64 [[VCVTAD_S64_F64_I]] // -int64_t test_test_vcvtad_s64_f64(float64_t a) { +int64_t test_vcvtad_s64_f64(float64_t a) { return (int64_t)vcvtad_s64_f64(a); } +// CHECK-LABEL: define {{[^@]+}}@test_vcvtas_s64_f32 +// CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTAS_S64_F32_I:%.*]] = call i64 @llvm.aarch64.neon.fcvtas.i64.f32(float [[A]]) +// CHECK-NEXT: ret i64 [[VCVTAS_S64_F32_I]] +// +int64_t test_vcvtas_s64_f32(float32_t a) { + return (int64_t)vcvtas_s64_f32(a); +} + +// CHECK-LABEL: define {{[^@]+}}@test_vcvtad_s32_f64 +// CHECK-SAME: (double noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTAD_S32_F64_I:%.*]] = call i32 @llvm.aarch64.neon.fcvtas.i32.f64(double [[A]]) +// CHECK-NEXT: ret i32 [[VCVTAD_S32_F64_I]] +// +int32_t test_vcvtad_s32_f64(float64_t a) { + return (int32_t)vcvtad_s32_f64(a); +} + // CHECK-LABEL: define {{[^@]+}}@test_vcvtas_u32_f32 // CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: @@ -56,6 +76,26 @@ uint64_t test_vcvtad_u64_f64(float64_t a) { return (uint64_t)vcvtad_u64_f64(a); } +// CHECK-LABEL: define {{[^@]+}}@test_vcvtas_u64_f32 +// CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTAS_U64_F32_I:%.*]] = call i64 @llvm.aarch64.neon.fcvtau.i64.f32(float [[A]]) +// CHECK-NEXT: ret i64 [[VCVTAS_U64_F32_I]] +// +uint64_t test_vcvtas_u64_f32(float32_t a) { + return (uint64_t)vcvtas_u64_f32(a); +} + +// CHECK-LABEL: define {{[^@]+}}@test_vcvtad_u32_f64 +// CHECK-SAME: (double noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTAD_U32_F64_I:%.*]] = call i32 @llvm.aarch64.neon.fcvtau.i32.f64(double [[A]]) +// CHECK-NEXT: ret i32 [[VCVTAD_U32_F64_I]] +// +uint32_t test_vcvtad_u32_f64(float64_t a) { + return (uint32_t)vcvtad_u32_f64(a); +} + // CHECK-LABEL: define {{[^@]+}}@test_vcvtms_s32_f32 // CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: @@ -76,6 +116,26 @@ int64_t test_vcvtmd_s64_f64(float64_t a) { return (int64_t)vcvtmd_s64_f64(a); } +// CHECK-LABEL: define {{[^@]+}}@test_vcvtms_s64_f32 +// CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTMS_S64_F32_I:%.*]] = call i64 @llvm.aarch64.neon.fcvtms.i64.f32(float [[A]]) +// CHECK-NEXT: ret i64 [[VCVTMS_S64_F32_I]] +// +int64_t test_vcvtms_s64_f32(float32_t a) { + return (int64_t)vcvtms_s64_f32(a); +} + +// CHECK-LABEL: define {{[^@]+}}@test_vcvtmd_s32_f64 +// CHECK-SAME: (double noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTMD_S32_F64_I:%.*]] = call i32 @llvm.aarch64.neon.fcvtms.i32.f64(double [[A]]) +// CHECK-NEXT: ret i32 [[VCVTMD_S32_F64_I]] +// +int32_t test_vcvtmd_s32_f64(float64_t a) { + return (int32_t)vcvtmd_s32_f64(a); +} + // CHECK-LABEL: define {{[^@]+}}@test_vcvtms_u32_f32 // CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: @@ -96,6 +156,26 @@ uint64_t test_vcvtmd_u64_f64(float64_t a) { return (uint64_t)vcvtmd_u64_f64(a); } +// CHECK-LABEL: define {{[^@]+}}@test_vcvtms_u64_f32 +// CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTMS_U64_F32_I:%.*]] = call i64 @llvm.aarch64.neon.fcvtmu.i64.f32(float [[A]]) +// CHECK-NEXT: ret i64 [[VCVTMS_U64_F32_I]] +// +uint64_t test_vcvtms_u64_f32(float32_t a) { + return (uint64_t)vcvtms_u64_f32(a); +} + +// CHECK-LABEL: define {{[^@]+}}@test_vcvtmd_u32_f64 +// CHECK-SAME: (double noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTMD_U32_F64_I:%.*]] = call i32 @llvm.aarch64.neon.fcvtmu.i32.f64(double [[A]]) +// CHECK-NEXT: ret i32 [[VCVTMD_U32_F64_I]] +// +uint32_t test_vcvtmd_u32_f64(float64_t a) { + return (uint32_t)vcvtmd_u32_f64(a); +} + // CHECK-LABEL: define {{[^@]+}}@test_vcvtns_s32_f32 // CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: @@ -116,6 +196,26 @@ int64_t test_vcvtnd_s64_f64(float64_t a) { return (int64_t)vcvtnd_s64_f64(a); } +// CHECK-LABEL: define {{[^@]+}}@test_vcvtns_s64_f32 +// CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTNS_S64_F32_I:%.*]] = call i64 @llvm.aarch64.neon.fcvtns.i64.f32(float [[A]]) +// CHECK-NEXT: ret i64 [[VCVTNS_S64_F32_I]] +// +int64_t test_vcvtns_s64_f32(float32_t a) { + return (int64_t)vcvtns_s64_f32(a); +} + +// CHECK-LABEL: define {{[^@]+}}@test_vcvtnd_s32_f64 +// CHECK-SAME: (double noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTND_S32_F64_I:%.*]] = call i32 @llvm.aarch64.neon.fcvtns.i32.f64(double [[A]]) +// CHECK-NEXT: ret i32 [[VCVTND_S32_F64_I]] +// +int32_t test_vcvtnd_s32_f64(float64_t a) { + return (int32_t)vcvtnd_s32_f64(a); +} + // CHECK-LABEL: define {{[^@]+}}@test_vcvtns_u32_f32 // CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: @@ -136,6 +236,26 @@ uint64_t test_vcvtnd_u64_f64(float64_t a) { return (uint64_t)vcvtnd_u64_f64(a); } +// CHECK-LABEL: define {{[^@]+}}@test_vcvtns_u64_f32 +// CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTNS_U64_F32_I:%.*]] = call i64 @llvm.aarch64.neon.fcvtnu.i64.f32(float [[A]]) +// CHECK-NEXT: ret i64 [[VCVTNS_U64_F32_I]] +// +uint64_t test_vcvtns_u64_f32(float32_t a) { + return (uint64_t)vcvtns_u64_f32(a); +} + +// CHECK-LABEL: define {{[^@]+}}@test_vcvtnd_u32_f64 +// CHECK-SAME: (double noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTND_U32_F64_I:%.*]] = call i32 @llvm.aarch64.neon.fcvtnu.i32.f64(double [[A]]) +// CHECK-NEXT: ret i32 [[VCVTND_U32_F64_I]] +// +uint32_t test_vcvtnd_u32_f64(float64_t a) { + return (uint32_t)vcvtnd_u32_f64(a); +} + // CHECK-LABEL: define {{[^@]+}}@test_vcvtps_s32_f32 // CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: @@ -156,6 +276,26 @@ int64_t test_vcvtpd_s64_f64(float64_t a) { return (int64_t)vcvtpd_s64_f64(a); } +// CHECK-LABEL: define {{[^@]+}}@test_vcvtps_s64_f32 +// CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTPS_S64_F32_I:%.*]] = call i64 @llvm.aarch64.neon.fcvtps.i64.f32(float [[A]]) +// CHECK-NEXT: ret i64 [[VCVTPS_S64_F32_I]] +// +int64_t test_vcvtps_s64_f32(float32_t a) { + return (int64_t)vcvtps_s64_f32(a); +} + +// CHECK-LABEL: define {{[^@]+}}@test_vcvtpd_s32_f64 +// CHECK-SAME: (double noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTPD_S32_F64_I:%.*]] = call i32 @llvm.aarch64.neon.fcvtps.i32.f64(double [[A]]) +// CHECK-NEXT: ret i32 [[VCVTPD_S32_F64_I]] +// +int32_t test_vcvtpd_s32_f64(float64_t a) { + return (int32_t)vcvtpd_s32_f64(a); +} + // CHECK-LABEL: define {{[^@]+}}@test_vcvtps_u32_f32 // CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: @@ -176,6 +316,26 @@ uint64_t test_vcvtpd_u64_f64(float64_t a) { return (uint64_t)vcvtpd_u64_f64(a); } +// CHECK-LABEL: define {{[^@]+}}@test_vcvtps_u64_f32 +// CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTPS_U64_F32_I:%.*]] = call i64 @llvm.aarch64.neon.fcvtpu.i64.f32(float [[A]]) +// CHECK-NEXT: ret i64 [[VCVTPS_U64_F32_I]] +// +uint64_t test_vcvtps_u64_f32(float32_t a) { + return (uint64_t)vcvtps_u64_f32(a); +} + +// CHECK-LABEL: define {{[^@]+}}@test_vcvtpd_u32_f64 +// CHECK-SAME: (double noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTPD_U32_F64_I:%.*]] = call i32 @llvm.aarch64.neon.fcvtpu.i32.f64(double [[A]]) +// CHECK-NEXT: ret i32 [[VCVTPD_U32_F64_I]] +// +uint32_t test_vcvtpd_u32_f64(float64_t a) { + return (uint32_t)vcvtpd_u32_f64(a); +} + // CHECK-LABEL: define {{[^@]+}}@test_vcvts_s32_f32 // CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: @@ -196,6 +356,26 @@ int64_t test_vcvtd_s64_f64(float64_t a) { return (int64_t)vcvtd_s64_f64(a); } +// CHECK-LABEL: define {{[^@]+}}@test_vcvts_s64_f32 +// CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTS_S64_F32_I:%.*]] = call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float [[A]]) +// CHECK-NEXT: ret i64 [[VCVTS_S64_F32_I]] +// +int64_t test_vcvts_s64_f32(float32_t a) { + return (int64_t)vcvts_s64_f32(a); +} + +// CHECK-LABEL: define {{[^@]+}}@test_vcvtd_s32_f64 +// CHECK-SAME: (double noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTD_S32_F64_I:%.*]] = call i32 @llvm.aarch64.neon.fcvtzs.i32.f64(double [[A]]) +// CHECK-NEXT: ret i32 [[VCVTD_S32_F64_I]] +// +int32_t test_vcvtd_s32_f64(float64_t a) { + return (int32_t)vcvtd_s32_f64(a); +} + // CHECK-LABEL: define {{[^@]+}}@test_vcvts_u32_f32 // CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { // CHECK-NEXT: entry: @@ -215,3 +395,24 @@ uint32_t test_vcvts_u32_f32(float32_t a) { uint64_t test_vcvtd_u64_f64(float64_t a) { return (uint64_t)vcvtd_u64_f64(a); } + +// CHECK-LABEL: define {{[^@]+}}@test_vcvts_u64_f32 +// CHECK-SAME: (float noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTS_U64_F32_I:%.*]] = call i64 @llvm.aarch64.neon.fcvtzu.i64.f32(float [[A]]) +// CHECK-NEXT: ret i64 [[VCVTS_U64_F32_I]] +// +uint64_t test_vcvts_u64_f32(float32_t a) { + return (uint64_t)vcvts_u64_f32(a); +} + +// CHECK-LABEL: define {{[^@]+}}@test_vcvtd_u32_f64 +// CHECK-SAME: (double noundef [[A:%.*]]) #[[ATTR0]] { +// CHECK-NEXT: entry: +// CHECK-NEXT: [[VCVTD_U32_F64_I:%.*]] = call i32 @llvm.aarch64.neon.fcvtzu.i32.f64(double [[A]]) +// CHECK-NEXT: ret i32 [[VCVTD_U32_F64_I]] +// +uint32_t test_vcvtd_u32_f64(float64_t a) { + return (uint32_t)vcvtd_u32_f64(a); +} + diff --git a/clang/test/CodeGen/AArch64/v9.6a-neon-f16-intrinsics.c b/clang/test/CodeGen/AArch64/v9.6a-neon-f16-intrinsics.c new file mode 100644 index 0000000..89ee9e3 --- /dev/null +++ b/clang/test/CodeGen/AArch64/v9.6a-neon-f16-intrinsics.c @@ -0,0 +1,23 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon -target-feature +v9.6a -target-feature +f8f16mm -target-feature +fp8 \ +// RUN: -disable-O0-optnone -emit-llvm -o - %s \ +// RUN: | opt -S -passes=mem2reg,sroa \ +// RUN: | FileCheck %s + +// REQUIRES: aarch64-registered-target + +#include <arm_neon.h> + +// CHECK-LABEL: define dso_local <8 x half> @test_vmmlaq_f16_mf8( +// CHECK-SAME: <8 x half> noundef [[P0:%.*]], <16 x i8> [[P1:%.*]], <16 x i8> [[P2:%.*]], i64 noundef [[P3:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-NEXT: [[ENTRY:.*:]] +// CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[P0]] to <8 x i16> +// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i16> [[TMP0]] to <16 x i8> +// CHECK-NEXT: call void @llvm.aarch64.set.fpmr(i64 [[P3]]) +// CHECK-NEXT: [[FMMLA_I:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> +// CHECK-NEXT: [[FMMLA1_I:%.*]] = call <8 x half> @llvm.aarch64.neon.fmmla.v8f16.v16i8(<8 x half> [[FMMLA_I]], <16 x i8> [[P1]], <16 x i8> [[P2]]) +// CHECK-NEXT: ret <8 x half> [[FMMLA1_I]] +// +float16x8_t test_vmmlaq_f16_mf8(float16x8_t p0, mfloat8x16_t p1, mfloat8x16_t p2, fpm_t p3) { + return vmmlaq_f16_mf8_fpm(p0, p1, p2, p3); +} diff --git a/clang/test/CodeGen/AArch64/v9.6a-neon-f32-intrinsics.c b/clang/test/CodeGen/AArch64/v9.6a-neon-f32-intrinsics.c new file mode 100644 index 0000000..13db72c --- /dev/null +++ b/clang/test/CodeGen/AArch64/v9.6a-neon-f32-intrinsics.c @@ -0,0 +1,21 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon -target-feature +v9.6a -target-feature +f8f32mm -target-feature +fp8 \ +// RUN: -disable-O0-optnone -emit-llvm -o - %s \ +// RUN: | opt -S -passes=mem2reg,sroa \ +// RUN: | FileCheck %s + +// REQUIRES: aarch64-registered-target + +#include <arm_neon.h> + +// CHECK-LABEL: define dso_local <4 x float> @test_vmmlaq_f32_mf8( +// CHECK-SAME: <4 x float> noundef [[P0:%.*]], <16 x i8> [[P1:%.*]], <16 x i8> [[P2:%.*]], i64 noundef [[P3:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-NEXT: [[ENTRY:.*:]] +// CHECK-NEXT: call void @llvm.aarch64.set.fpmr(i64 [[P3]]) +// CHECK-NEXT: [[FMMLA_I:%.*]] = call <4 x float> @llvm.aarch64.neon.fmmla.v4f32.v16i8(<4 x float> [[P0]], <16 x i8> [[P1]], <16 x i8> [[P2]]) +// CHECK-NEXT: ret <4 x float> [[FMMLA_I]] +// +float32x4_t test_vmmlaq_f32_mf8(float32x4_t p0, mfloat8x16_t p1, mfloat8x16_t p2, fpm_t p3) { + return vmmlaq_f32_mf8_fpm(p0, p1, p2, p3); +} + |
