1; RUN: llc -mtriple=thumbv8.1m.main -mattr=+cdecp0 -mattr=+cdecp1 -mattr=+mve -verify-machineinstrs -o - %s | FileCheck %s 2; RUN: llc -mtriple=thumbv8m.main -mattr=+cdecp0 -mattr=+cdecp1 -mattr=+fp-armv8d16sp -verify-machineinstrs -o - %s | FileCheck %s 3 4declare float @llvm.arm.cde.vcx1.f32(i32 immarg, i32 immarg) 5declare float @llvm.arm.cde.vcx1a.f32(i32 immarg, float, i32 immarg) 6declare float @llvm.arm.cde.vcx2.f32(i32 immarg, float, i32 immarg) 7declare float @llvm.arm.cde.vcx2a.f32(i32 immarg, float, float, i32 immarg) 8declare float @llvm.arm.cde.vcx3.f32(i32 immarg, float, float, i32 immarg) 9declare float @llvm.arm.cde.vcx3a.f32(i32 immarg, float, float, float, i32 immarg) 10 11declare double @llvm.arm.cde.vcx1.f64(i32 immarg, i32 immarg) 12declare double @llvm.arm.cde.vcx1a.f64(i32 immarg, double, i32 immarg) 13declare double @llvm.arm.cde.vcx2.f64(i32 immarg, double, i32 immarg) 14declare double @llvm.arm.cde.vcx2a.f64(i32 immarg, double, double, i32 immarg) 15declare double @llvm.arm.cde.vcx3.f64(i32 immarg, double, double, i32 immarg) 16declare double @llvm.arm.cde.vcx3a.f64(i32 immarg, double, double, double, i32 immarg) 17 18define arm_aapcs_vfpcc i32 @test_vcx1_u32() { 19; CHECK-LABEL: test_vcx1_u32: 20; CHECK: @ %bb.0: @ %entry 21; CHECK-NEXT: vcx1 p0, s0, #11 22; CHECK-NEXT: vmov r0, s0 23; CHECK-NEXT: bx lr 24entry: 25 %0 = call float @llvm.arm.cde.vcx1.f32(i32 0, i32 11) 26 %1 = bitcast float %0 to i32 27 ret i32 %1 28} 29 30define arm_aapcs_vfpcc i32 @test_vcx1a_u32(i32 %acc) { 31; CHECK-LABEL: test_vcx1a_u32: 32; CHECK: @ %bb.0: @ %entry 33; CHECK-NEXT: vmov s0, r0 34; CHECK-NEXT: vcx1a p1, s0, #12 35; CHECK-NEXT: vmov r0, s0 36; CHECK-NEXT: bx lr 37entry: 38 %0 = bitcast i32 %acc to float 39 %1 = call float @llvm.arm.cde.vcx1a.f32(i32 1, float %0, i32 12) 40 %2 = bitcast float %1 to i32 41 ret i32 %2 42} 43 44define arm_aapcs_vfpcc i32 @test_vcx2_u32(i32 %n) { 45; CHECK-LABEL: test_vcx2_u32: 46; CHECK: @ %bb.0: @ %entry 47; CHECK-NEXT: vmov s0, r0 48; CHECK-NEXT: vcx2 p0, s0, s0, #21 49; CHECK-NEXT: vmov r0, s0 50; CHECK-NEXT: bx lr 51entry: 52 %0 = bitcast i32 %n to float 53 %1 = call float @llvm.arm.cde.vcx2.f32(i32 0, float %0, i32 21) 54 %2 = bitcast float %1 to i32 55 ret i32 %2 56} 57 58define arm_aapcs_vfpcc i32 @test_vcx2a_u32(i32 %acc, i32 %n) { 59; CHECK-LABEL: test_vcx2a_u32: 60; CHECK: @ %bb.0: @ %entry 61; CHECK-NEXT: vmov s0, r1 62; CHECK-NEXT: vmov s2, r0 63; CHECK-NEXT: vcx2a p0, s2, s0, #22 64; CHECK-NEXT: vmov r0, s2 65; CHECK-NEXT: bx lr 66entry: 67 %0 = bitcast i32 %acc to float 68 %1 = bitcast i32 %n to float 69 %2 = call float @llvm.arm.cde.vcx2a.f32(i32 0, float %0, float %1, i32 22) 70 %3 = bitcast float %2 to i32 71 ret i32 %3 72} 73 74define arm_aapcs_vfpcc i32 @test_vcx3_u32(i32 %n, i32 %m) { 75; CHECK-LABEL: test_vcx3_u32: 76; CHECK: @ %bb.0: @ %entry 77; CHECK-NEXT: vmov s0, r1 78; CHECK-NEXT: vmov s2, r0 79; CHECK-NEXT: vcx3 p1, s0, s2, s0, #3 80; CHECK-NEXT: vmov r0, s0 81; CHECK-NEXT: bx lr 82entry: 83 %0 = bitcast i32 %n to float 84 %1 = bitcast i32 %m to float 85 %2 = call float @llvm.arm.cde.vcx3.f32(i32 1, float %0, float %1, i32 3) 86 %3 = bitcast float %2 to i32 87 ret i32 %3 88} 89 90define arm_aapcs_vfpcc i32 @test_vcx3a_u32(i32 %acc, i32 %n, i32 %m) { 91; CHECK-LABEL: test_vcx3a_u32: 92; CHECK: @ %bb.0: @ %entry 93; CHECK-NEXT: vmov s0, r2 94; CHECK-NEXT: vmov s2, r1 95; CHECK-NEXT: vmov s4, r0 96; CHECK-NEXT: vcx3a p0, s4, s2, s0, #5 97; CHECK-NEXT: vmov r0, s4 98; CHECK-NEXT: bx lr 99entry: 100 %0 = bitcast i32 %acc to float 101 %1 = bitcast i32 %n to float 102 %2 = bitcast i32 %m to float 103 %3 = call float @llvm.arm.cde.vcx3a.f32(i32 0, float %0, float %1, float %2, i32 5) 104 %4 = bitcast float %3 to i32 105 ret i32 %4 106} 107 108define arm_aapcs_vfpcc i64 @test_vcx1d_u64() { 109; CHECK-LABEL: test_vcx1d_u64: 110; CHECK: @ %bb.0: @ %entry 111; CHECK-NEXT: vcx1 p0, d0, #11 112; CHECK-NEXT: vmov r0, r1, d0 113; CHECK-NEXT: bx lr 114entry: 115 %0 = call double @llvm.arm.cde.vcx1.f64(i32 0, i32 11) 116 %1 = bitcast double %0 to i64 117 ret i64 %1 118} 119 120define arm_aapcs_vfpcc i64 @test_vcx1da_u64(i64 %acc) { 121; CHECK-LABEL: test_vcx1da_u64: 122; CHECK: @ %bb.0: @ %entry 123; CHECK-NEXT: vmov d0, r0, r1 124; CHECK-NEXT: vcx1a p1, d0, #12 125; CHECK-NEXT: vmov r0, r1, d0 126; CHECK-NEXT: bx lr 127entry: 128 %0 = bitcast i64 %acc to double 129 %1 = call double @llvm.arm.cde.vcx1a.f64(i32 1, double %0, i32 12) 130 %2 = bitcast double %1 to i64 131 ret i64 %2 132} 133 134define arm_aapcs_vfpcc i64 @test_vcx2d_u64(i64 %n) { 135; CHECK-LABEL: test_vcx2d_u64: 136; CHECK: @ %bb.0: @ %entry 137; CHECK-NEXT: vmov d0, r0, r1 138; CHECK-NEXT: vcx2 p0, d0, d0, #21 139; CHECK-NEXT: vmov r0, r1, d0 140; CHECK-NEXT: bx lr 141entry: 142 %0 = bitcast i64 %n to double 143 %1 = call double @llvm.arm.cde.vcx2.f64(i32 0, double %0, i32 21) 144 %2 = bitcast double %1 to i64 145 ret i64 %2 146} 147 148define arm_aapcs_vfpcc i64 @test_vcx2da_u64(i64 %acc, i64 %n) { 149; CHECK-LABEL: test_vcx2da_u64: 150; CHECK: @ %bb.0: @ %entry 151; CHECK-NEXT: vmov d0, r2, r3 152; CHECK-NEXT: vmov d1, r0, r1 153; CHECK-NEXT: vcx2a p0, d1, d0, #22 154; CHECK-NEXT: vmov r0, r1, d1 155; CHECK-NEXT: bx lr 156entry: 157 %0 = bitcast i64 %acc to double 158 %1 = bitcast i64 %n to double 159 %2 = call double @llvm.arm.cde.vcx2a.f64(i32 0, double %0, double %1, i32 22) 160 %3 = bitcast double %2 to i64 161 ret i64 %3 162} 163 164define arm_aapcs_vfpcc i64 @test_vcx3d_u64(i64 %n, i64 %m) { 165; CHECK-LABEL: test_vcx3d_u64: 166; CHECK: @ %bb.0: @ %entry 167; CHECK-NEXT: vmov d0, r2, r3 168; CHECK-NEXT: vmov d1, r0, r1 169; CHECK-NEXT: vcx3 p1, d0, d1, d0, #3 170; CHECK-NEXT: vmov r0, r1, d0 171; CHECK-NEXT: bx lr 172entry: 173 %0 = bitcast i64 %n to double 174 %1 = bitcast i64 %m to double 175 %2 = call double @llvm.arm.cde.vcx3.f64(i32 1, double %0, double %1, i32 3) 176 %3 = bitcast double %2 to i64 177 ret i64 %3 178} 179 180define arm_aapcs_vfpcc i64 @test_vcx3da_u64(i64 %acc, i64 %n, i64 %m) { 181; CHECK-LABEL: test_vcx3da_u64: 182; CHECK: @ %bb.0: @ %entry 183; CHECK-NEXT: push {r7, lr} 184; CHECK-NEXT: ldrd lr, r12, [sp, #8] 185; CHECK-DAG: vmov [[D0:d.*]], r0, r1 186; CHECK-DAG: vmov [[D1:d.*]], r2, r3 187; CHECK-DAG: vmov [[D2:d.*]], lr, r12 188; CHECK-NEXT: vcx3a p0, [[D0]], [[D1]], [[D2]], #5 189; CHECK-NEXT: vmov r0, r1, [[D0]] 190; CHECK-NEXT: pop {r7, pc} 191entry: 192 %0 = bitcast i64 %acc to double 193 %1 = bitcast i64 %n to double 194 %2 = bitcast i64 %m to double 195 %3 = call double @llvm.arm.cde.vcx3a.f64(i32 0, double %0, double %1, double %2, i32 5) 196 %4 = bitcast double %3 to i64 197 ret i64 %4 198} 199