1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm64 -aarch64-neon-syntax=apple -asm-verbose=false < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine signext i8 @test_vminv_s8(<8 x i8> %a1) { 4*9880d681SAndroid Build Coastguard Worker; CHECK: test_vminv_s8 5*9880d681SAndroid Build Coastguard Worker; CHECK: sminv.8b b[[REGNUM:[0-9]+]], v0 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smov.b w0, v[[REGNUM]][0] 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.sminv.i32.v8i8(<8 x i8> %a1) 10*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %vminv.i to i8 11*9880d681SAndroid Build Coastguard Worker ret i8 %0 12*9880d681SAndroid Build Coastguard Worker} 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine signext i16 @test_vminv_s16(<4 x i16> %a1) { 15*9880d681SAndroid Build Coastguard Worker; CHECK: test_vminv_s16 16*9880d681SAndroid Build Coastguard Worker; CHECK: sminv.4h h[[REGNUM:[0-9]+]], v0 17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smov.h w0, v[[REGNUM]][0] 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 19*9880d681SAndroid Build Coastguard Workerentry: 20*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.sminv.i32.v4i16(<4 x i16> %a1) 21*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %vminv.i to i16 22*9880d681SAndroid Build Coastguard Worker ret i16 %0 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vminv_s32(<2 x i32> %a1) { 26*9880d681SAndroid Build Coastguard Worker; CHECK: test_vminv_s32 27*9880d681SAndroid Build Coastguard Worker; 2 x i32 is not supported by the ISA, thus, this is a special case 28*9880d681SAndroid Build Coastguard Worker; CHECK: sminp.2s v[[REGNUM:[0-9]+]], v0, v0 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, s[[REGNUM]] 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 31*9880d681SAndroid Build Coastguard Workerentry: 32*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.sminv.i32.v2i32(<2 x i32> %a1) 33*9880d681SAndroid Build Coastguard Worker ret i32 %vminv.i 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine signext i8 @test_vminvq_s8(<16 x i8> %a1) { 37*9880d681SAndroid Build Coastguard Worker; CHECK: test_vminvq_s8 38*9880d681SAndroid Build Coastguard Worker; CHECK: sminv.16b b[[REGNUM:[0-9]+]], v0 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smov.b w0, v[[REGNUM]][0] 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 41*9880d681SAndroid Build Coastguard Workerentry: 42*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.sminv.i32.v16i8(<16 x i8> %a1) 43*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %vminv.i to i8 44*9880d681SAndroid Build Coastguard Worker ret i8 %0 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine signext i16 @test_vminvq_s16(<8 x i16> %a1) { 48*9880d681SAndroid Build Coastguard Worker; CHECK: test_vminvq_s16 49*9880d681SAndroid Build Coastguard Worker; CHECK: sminv.8h h[[REGNUM:[0-9]+]], v0 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: smov.h w0, v[[REGNUM]][0] 51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 52*9880d681SAndroid Build Coastguard Workerentry: 53*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.sminv.i32.v8i16(<8 x i16> %a1) 54*9880d681SAndroid Build Coastguard Worker %0 = trunc i32 %vminv.i to i16 55*9880d681SAndroid Build Coastguard Worker ret i16 %0 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vminvq_s32(<4 x i32> %a1) { 59*9880d681SAndroid Build Coastguard Worker; CHECK: test_vminvq_s32 60*9880d681SAndroid Build Coastguard Worker; CHECK: sminv.4s [[REGNUM:s[0-9]+]], v0 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov w0, [[REGNUM]] 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 63*9880d681SAndroid Build Coastguard Workerentry: 64*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.sminv.i32.v4i32(<4 x i32> %a1) 65*9880d681SAndroid Build Coastguard Worker ret i32 %vminv.i 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vminv_s8_used_by_laneop(<8 x i8> %a1, <8 x i8> %a2) { 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminv_s8_used_by_laneop: 70*9880d681SAndroid Build Coastguard Worker; CHECK: sminv.8b b[[REGNUM:[0-9]+]], v1 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0] 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 73*9880d681SAndroid Build Coastguard Workerentry: 74*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.sminv.i32.v8i8(<8 x i8> %a2) 75*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i8 76*9880d681SAndroid Build Coastguard Worker %2 = insertelement <8 x i8> %a1, i8 %1, i32 3 77*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %2 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vminv_s16_used_by_laneop(<4 x i16> %a1, <4 x i16> %a2) { 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminv_s16_used_by_laneop: 82*9880d681SAndroid Build Coastguard Worker; CHECK: sminv.4h h[[REGNUM:[0-9]+]], v1 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0] 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 85*9880d681SAndroid Build Coastguard Workerentry: 86*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.sminv.i32.v4i16(<4 x i16> %a2) 87*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i16 88*9880d681SAndroid Build Coastguard Worker %2 = insertelement <4 x i16> %a1, i16 %1, i32 3 89*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %2 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vminv_s32_used_by_laneop(<2 x i32> %a1, <2 x i32> %a2) { 93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminv_s32_used_by_laneop: 94*9880d681SAndroid Build Coastguard Worker; CHECK: sminp.2s v[[REGNUM:[0-9]+]], v1, v1 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[1], v[[REGNUM]][0] 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 97*9880d681SAndroid Build Coastguard Workerentry: 98*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.sminv.i32.v2i32(<2 x i32> %a2) 99*9880d681SAndroid Build Coastguard Worker %1 = insertelement <2 x i32> %a1, i32 %0, i32 1 100*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %1 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vminvq_s8_used_by_laneop(<16 x i8> %a1, <16 x i8> %a2) { 104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminvq_s8_used_by_laneop: 105*9880d681SAndroid Build Coastguard Worker; CHECK: sminv.16b b[[REGNUM:[0-9]+]], v1 106*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0] 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 108*9880d681SAndroid Build Coastguard Workerentry: 109*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.sminv.i32.v16i8(<16 x i8> %a2) 110*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i8 111*9880d681SAndroid Build Coastguard Worker %2 = insertelement <16 x i8> %a1, i8 %1, i32 3 112*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %2 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vminvq_s16_used_by_laneop(<8 x i16> %a1, <8 x i16> %a2) { 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminvq_s16_used_by_laneop: 117*9880d681SAndroid Build Coastguard Worker; CHECK: sminv.8h h[[REGNUM:[0-9]+]], v1 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0] 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.sminv.i32.v8i16(<8 x i16> %a2) 122*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i16 123*9880d681SAndroid Build Coastguard Worker %2 = insertelement <8 x i16> %a1, i16 %1, i32 3 124*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %2 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vminvq_s32_used_by_laneop(<4 x i32> %a1, <4 x i32> %a2) { 128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminvq_s32_used_by_laneop: 129*9880d681SAndroid Build Coastguard Worker; CHECK: sminv.4s s[[REGNUM:[0-9]+]], v1 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[3], v[[REGNUM]][0] 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 132*9880d681SAndroid Build Coastguard Workerentry: 133*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.sminv.i32.v4i32(<4 x i32> %a2) 134*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x i32> %a1, i32 %0, i32 3 135*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.sminv.i32.v4i32(<4 x i32>) 139*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.sminv.i32.v8i16(<8 x i16>) 140*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.sminv.i32.v16i8(<16 x i8>) 141*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.sminv.i32.v2i32(<2 x i32>) 142*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.sminv.i32.v4i16(<4 x i16>) 143*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.sminv.i32.v8i8(<8 x i8>) 144*9880d681SAndroid Build Coastguard Worker 145