1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple -asm-verbose=false | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine i32 @vmin_u8x8(<8 x i8> %a) nounwind ssp { 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vmin_u8x8: 5*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.8b b[[REG:[0-9]+]], v0 6*9880d681SAndroid Build Coastguard Worker; CHECK: fmov [[REG2:w[0-9]+]], s[[REG]] 7*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and 8*9880d681SAndroid Build Coastguard Worker; CHECK: cbz [[REG2]], 9*9880d681SAndroid Build Coastguard Workerentry: 10*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8> %a) nounwind 11*9880d681SAndroid Build Coastguard Worker %tmp = trunc i32 %vminv.i to i8 12*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %tmp, 0 13*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %return, label %if.then 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerif.then: 16*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() nounwind 17*9880d681SAndroid Build Coastguard Worker br label %return 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerreturn: 20*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ] 21*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdeclare i32 @bar(...) 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdefine i32 @vmin_u4x16(<4 x i16> %a) nounwind ssp { 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vmin_u4x16: 28*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.4h h[[REG:[0-9]+]], v0 29*9880d681SAndroid Build Coastguard Worker; CHECK: fmov [[REG2:w[0-9]+]], s[[REG]] 30*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and 31*9880d681SAndroid Build Coastguard Worker; CHECK: cbz [[REG2]], 32*9880d681SAndroid Build Coastguard Workerentry: 33*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v4i16(<4 x i16> %a) nounwind 34*9880d681SAndroid Build Coastguard Worker %tmp = trunc i32 %vminv.i to i16 35*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 %tmp, 0 36*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %return, label %if.then 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerif.then: 39*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() nounwind 40*9880d681SAndroid Build Coastguard Worker br label %return 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerreturn: 43*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ] 44*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 45*9880d681SAndroid Build Coastguard Worker} 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerdefine i32 @vmin_u8x16(<8 x i16> %a) nounwind ssp { 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vmin_u8x16: 49*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.8h h[[REG:[0-9]+]], v0 50*9880d681SAndroid Build Coastguard Worker; CHECK: fmov [[REG2:w[0-9]+]], s[[REG]] 51*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and 52*9880d681SAndroid Build Coastguard Worker; CHECK: cbz [[REG2]], 53*9880d681SAndroid Build Coastguard Workerentry: 54*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v8i16(<8 x i16> %a) nounwind 55*9880d681SAndroid Build Coastguard Worker %tmp = trunc i32 %vminv.i to i16 56*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i16 %tmp, 0 57*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %return, label %if.then 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerif.then: 60*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() nounwind 61*9880d681SAndroid Build Coastguard Worker br label %return 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerreturn: 64*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ] 65*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine i32 @vmin_u16x8(<16 x i8> %a) nounwind ssp { 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vmin_u16x8: 70*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.16b b[[REG:[0-9]+]], v0 71*9880d681SAndroid Build Coastguard Worker; CHECK: fmov [[REG2:w[0-9]+]], s[[REG]] 72*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and 73*9880d681SAndroid Build Coastguard Worker; CHECK: cbz [[REG2]], 74*9880d681SAndroid Build Coastguard Workerentry: 75*9880d681SAndroid Build Coastguard Worker %vminv.i = tail call i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8> %a) nounwind 76*9880d681SAndroid Build Coastguard Worker %tmp = trunc i32 %vminv.i to i8 77*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %tmp, 0 78*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %return, label %if.then 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerif.then: 81*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 bitcast (i32 (...)* @bar to i32 ()*)() nounwind 82*9880d681SAndroid Build Coastguard Worker br label %return 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerreturn: 85*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %call1, %if.then ], [ 0, %entry ] 86*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vminv_u8_used_by_laneop(<8 x i8> %a1, <8 x i8> %a2) { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminv_u8_used_by_laneop: 91*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.8b b[[REGNUM:[0-9]+]], v1 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0] 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 94*9880d681SAndroid Build Coastguard Workerentry: 95*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8> %a2) 96*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i8 97*9880d681SAndroid Build Coastguard Worker %2 = insertelement <8 x i8> %a1, i8 %1, i32 3 98*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %2 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vminv_u16_used_by_laneop(<4 x i16> %a1, <4 x i16> %a2) { 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminv_u16_used_by_laneop: 103*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.4h h[[REGNUM:[0-9]+]], v1 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0] 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 106*9880d681SAndroid Build Coastguard Workerentry: 107*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.uminv.i32.v4i16(<4 x i16> %a2) 108*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i16 109*9880d681SAndroid Build Coastguard Worker %2 = insertelement <4 x i16> %a1, i16 %1, i32 3 110*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %2 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vminv_u32_used_by_laneop(<2 x i32> %a1, <2 x i32> %a2) { 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminv_u32_used_by_laneop: 115*9880d681SAndroid Build Coastguard Worker; CHECK: uminp.2s v[[REGNUM:[0-9]+]], v1, v1 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[1], v[[REGNUM]][0] 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 118*9880d681SAndroid Build Coastguard Workerentry: 119*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.uminv.i32.v2i32(<2 x i32> %a2) 120*9880d681SAndroid Build Coastguard Worker %1 = insertelement <2 x i32> %a1, i32 %0, i32 1 121*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %1 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vminvq_u8_used_by_laneop(<16 x i8> %a1, <16 x i8> %a2) { 125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminvq_u8_used_by_laneop: 126*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.16b b[[REGNUM:[0-9]+]], v1 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.b v0[3], v[[REGNUM]][0] 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 129*9880d681SAndroid Build Coastguard Workerentry: 130*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8> %a2) 131*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i8 132*9880d681SAndroid Build Coastguard Worker %2 = insertelement <16 x i8> %a1, i8 %1, i32 3 133*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %2 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vminvq_u16_used_by_laneop(<8 x i16> %a1, <8 x i16> %a2) { 137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminvq_u16_used_by_laneop: 138*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.8h h[[REGNUM:[0-9]+]], v1 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.h v0[3], v[[REGNUM]][0] 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 141*9880d681SAndroid Build Coastguard Workerentry: 142*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.uminv.i32.v8i16(<8 x i16> %a2) 143*9880d681SAndroid Build Coastguard Worker %1 = trunc i32 %0 to i16 144*9880d681SAndroid Build Coastguard Worker %2 = insertelement <8 x i16> %a1, i16 %1, i32 3 145*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %2 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vminvq_u32_used_by_laneop(<4 x i32> %a1, <4 x i32> %a2) { 149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vminvq_u32_used_by_laneop: 150*9880d681SAndroid Build Coastguard Worker; CHECK: uminv.4s s[[REGNUM:[0-9]+]], v1 151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[3], v[[REGNUM]][0] 152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 153*9880d681SAndroid Build Coastguard Workerentry: 154*9880d681SAndroid Build Coastguard Worker %0 = tail call i32 @llvm.aarch64.neon.uminv.i32.v4i32(<4 x i32> %a2) 155*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x i32> %a1, i32 %0, i32 3 156*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 157*9880d681SAndroid Build Coastguard Worker} 158*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v16i8(<16 x i8>) nounwind readnone 159*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v8i16(<8 x i16>) nounwind readnone 160*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v4i16(<4 x i16>) nounwind readnone 161*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v8i8(<8 x i8>) nounwind readnone 162*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v2i32(<2 x i32>) nounwind readnone 163*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.aarch64.neon.uminv.i32.v4i32(<4 x i32>) nounwind readnone 164