148 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py2// RUN: %clang_cc1 -triple thumbv8.1m.main-none-none-eabi \3// RUN: -target-feature +cdecp0 -target-feature +cdecp1 \4// RUN: -mfloat-abi hard -O0 -disable-O0-optnone \5// RUN: -emit-llvm -o - %s | opt -S -passes=mem2reg | FileCheck %s6 7// REQUIRES: aarch64-registered-target || arm-registered-target8 9#include <arm_cde.h>10 11// CHECK-LABEL: @test_vcx1_u32(12// CHECK-NEXT: entry:13// CHECK-NEXT: [[TMP0:%.*]] = call float @llvm.arm.cde.vcx1.f32(i32 0, i32 11)14// CHECK-NEXT: [[TMP1:%.*]] = bitcast float [[TMP0]] to i3215// CHECK-NEXT: ret i32 [[TMP1]]16//17uint32_t test_vcx1_u32(void) {18 return __arm_vcx1_u32(0, 11);19}20 21// CHECK-LABEL: @test_vcx1a_u32(22// CHECK-NEXT: entry:23// CHECK-NEXT: [[TMP0:%.*]] = bitcast i32 [[ACC:%.*]] to float24// CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.arm.cde.vcx1a.f32(i32 1, float [[TMP0]], i32 12)25// CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[TMP1]] to i3226// CHECK-NEXT: ret i32 [[TMP2]]27//28uint32_t test_vcx1a_u32(uint32_t acc) {29 return __arm_vcx1a_u32(1, acc, 12);30}31 32// CHECK-LABEL: @test_vcx2_u32(33// CHECK-NEXT: entry:34// CHECK-NEXT: [[TMP0:%.*]] = bitcast i32 [[N:%.*]] to float35// CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.arm.cde.vcx2.f32(i32 0, float [[TMP0]], i32 21)36// CHECK-NEXT: [[TMP2:%.*]] = bitcast float [[TMP1]] to i3237// CHECK-NEXT: ret i32 [[TMP2]]38//39uint32_t test_vcx2_u32(uint32_t n) {40 return __arm_vcx2_u32(0, n, 21);41}42 43// CHECK-LABEL: @test_vcx2a_u32(44// CHECK-NEXT: entry:45// CHECK-NEXT: [[TMP0:%.*]] = bitcast i32 [[ACC:%.*]] to float46// CHECK-NEXT: [[TMP1:%.*]] = bitcast i32 [[N:%.*]] to float47// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.arm.cde.vcx2a.f32(i32 0, float [[TMP0]], float [[TMP1]], i32 22)48// CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[TMP2]] to i3249// CHECK-NEXT: ret i32 [[TMP3]]50//51uint32_t test_vcx2a_u32(uint32_t acc, uint32_t n) {52 return __arm_vcx2a_u32(0, acc, n, 22);53}54 55// CHECK-LABEL: @test_vcx3_u32(56// CHECK-NEXT: entry:57// CHECK-NEXT: [[TMP0:%.*]] = bitcast i32 [[N:%.*]] to float58// CHECK-NEXT: [[TMP1:%.*]] = bitcast i32 [[M:%.*]] to float59// CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.arm.cde.vcx3.f32(i32 1, float [[TMP0]], float [[TMP1]], i32 3)60// CHECK-NEXT: [[TMP3:%.*]] = bitcast float [[TMP2]] to i3261// CHECK-NEXT: ret i32 [[TMP3]]62//63uint32_t test_vcx3_u32(uint32_t n, uint32_t m) {64 return __arm_vcx3_u32(1, n, m, 3);65}66 67// CHECK-LABEL: @test_vcx3a_u32(68// CHECK-NEXT: entry:69// CHECK-NEXT: [[TMP0:%.*]] = bitcast i32 [[ACC:%.*]] to float70// CHECK-NEXT: [[TMP1:%.*]] = bitcast i32 [[N:%.*]] to float71// CHECK-NEXT: [[TMP2:%.*]] = bitcast i32 [[M:%.*]] to float72// CHECK-NEXT: [[TMP3:%.*]] = call float @llvm.arm.cde.vcx3a.f32(i32 0, float [[TMP0]], float [[TMP1]], float [[TMP2]], i32 5)73// CHECK-NEXT: [[TMP4:%.*]] = bitcast float [[TMP3]] to i3274// CHECK-NEXT: ret i32 [[TMP4]]75//76uint32_t test_vcx3a_u32(uint32_t acc, uint32_t n, uint32_t m) {77 return __arm_vcx3a_u32(0, acc, n, m, 5);78}79 80// CHECK-LABEL: @test_vcx1d_u64(81// CHECK-NEXT: entry:82// CHECK-NEXT: [[TMP0:%.*]] = call double @llvm.arm.cde.vcx1.f64(i32 0, i32 11)83// CHECK-NEXT: [[TMP1:%.*]] = bitcast double [[TMP0]] to i6484// CHECK-NEXT: ret i64 [[TMP1]]85//86uint64_t test_vcx1d_u64(void) {87 return __arm_vcx1d_u64(0, 11);88}89 90// CHECK-LABEL: @test_vcx1da_u64(91// CHECK-NEXT: entry:92// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[ACC:%.*]] to double93// CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.arm.cde.vcx1a.f64(i32 1, double [[TMP0]], i32 12)94// CHECK-NEXT: [[TMP2:%.*]] = bitcast double [[TMP1]] to i6495// CHECK-NEXT: ret i64 [[TMP2]]96//97uint64_t test_vcx1da_u64(uint64_t acc) {98 return __arm_vcx1da_u64(1, acc, 12);99}100 101// CHECK-LABEL: @test_vcx2d_u64(102// CHECK-NEXT: entry:103// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[N:%.*]] to double104// CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.arm.cde.vcx2.f64(i32 0, double [[TMP0]], i32 21)105// CHECK-NEXT: [[TMP2:%.*]] = bitcast double [[TMP1]] to i64106// CHECK-NEXT: ret i64 [[TMP2]]107//108uint64_t test_vcx2d_u64(uint64_t n) {109 return __arm_vcx2d_u64(0, n, 21);110}111 112// CHECK-LABEL: @test_vcx2da_u64(113// CHECK-NEXT: entry:114// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[ACC:%.*]] to double115// CHECK-NEXT: [[TMP1:%.*]] = bitcast i64 [[N:%.*]] to double116// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.arm.cde.vcx2a.f64(i32 0, double [[TMP0]], double [[TMP1]], i32 22)117// CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[TMP2]] to i64118// CHECK-NEXT: ret i64 [[TMP3]]119//120uint64_t test_vcx2da_u64(uint64_t acc, uint64_t n) {121 return __arm_vcx2da_u64(0, acc, n, 22);122}123 124// CHECK-LABEL: @test_vcx3d_u64(125// CHECK-NEXT: entry:126// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[N:%.*]] to double127// CHECK-NEXT: [[TMP1:%.*]] = bitcast i64 [[M:%.*]] to double128// CHECK-NEXT: [[TMP2:%.*]] = call double @llvm.arm.cde.vcx3.f64(i32 1, double [[TMP0]], double [[TMP1]], i32 3)129// CHECK-NEXT: [[TMP3:%.*]] = bitcast double [[TMP2]] to i64130// CHECK-NEXT: ret i64 [[TMP3]]131//132uint64_t test_vcx3d_u64(uint64_t n, uint64_t m) {133 return __arm_vcx3d_u64(1, n, m, 3);134}135 136// CHECK-LABEL: @test_vcx3da_u64(137// CHECK-NEXT: entry:138// CHECK-NEXT: [[TMP0:%.*]] = bitcast i64 [[ACC:%.*]] to double139// CHECK-NEXT: [[TMP1:%.*]] = bitcast i64 [[N:%.*]] to double140// CHECK-NEXT: [[TMP2:%.*]] = bitcast i64 [[M:%.*]] to double141// CHECK-NEXT: [[TMP3:%.*]] = call double @llvm.arm.cde.vcx3a.f64(i32 0, double [[TMP0]], double [[TMP1]], double [[TMP2]], i32 5)142// CHECK-NEXT: [[TMP4:%.*]] = bitcast double [[TMP3]] to i64143// CHECK-NEXT: ret i64 [[TMP4]]144//145uint64_t test_vcx3da_u64(uint64_t acc, uint64_t n, uint64_t m) {146 return __arm_vcx3da_u64(0, acc, n, m, 5);147}148