1*71dc3de5SCaleb Zulawski; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*71dc3de5SCaleb Zulawski; RUN: llc < %s -mtriple=armv7-none-eabi -float-abi=hard -mattr=+neon -verify-machineinstrs | FileCheck %s 3*71dc3de5SCaleb Zulawski 4*71dc3de5SCaleb Zulawskidefine i8 @test_umin_v8i8(<8 x i8> %x) { 5*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_umin_v8i8: 6*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 7*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u8 d16, d0, d0 8*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u8 d16, d16, d16 9*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u8 d16, d16, d16 10*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.u8 r0, d16[0] 11*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 12*71dc3de5SCaleb Zulawskientry: 13*71dc3de5SCaleb Zulawski %z = call i8 @llvm.vector.reduce.umin.v8i8(<8 x i8> %x) 14*71dc3de5SCaleb Zulawski ret i8 %z 15*71dc3de5SCaleb Zulawski} 16*71dc3de5SCaleb Zulawski 17*71dc3de5SCaleb Zulawskidefine i8 @test_smin_v8i8(<8 x i8> %x) { 18*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_smin_v8i8: 19*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 20*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.s8 d16, d0, d0 21*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.s8 d16, d16, d16 22*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.s8 d16, d16, d16 23*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.s8 r0, d16[0] 24*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 25*71dc3de5SCaleb Zulawskientry: 26*71dc3de5SCaleb Zulawski %z = call i8 @llvm.vector.reduce.smin.v8i8(<8 x i8> %x) 27*71dc3de5SCaleb Zulawski ret i8 %z 28*71dc3de5SCaleb Zulawski} 29*71dc3de5SCaleb Zulawski 30*71dc3de5SCaleb Zulawskidefine i8 @test_umax_v8i8(<8 x i8> %x) { 31*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_umax_v8i8: 32*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 33*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.u8 d16, d0, d0 34*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.u8 d16, d16, d16 35*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.u8 d16, d16, d16 36*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.u8 r0, d16[0] 37*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 38*71dc3de5SCaleb Zulawskientry: 39*71dc3de5SCaleb Zulawski %z = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> %x) 40*71dc3de5SCaleb Zulawski ret i8 %z 41*71dc3de5SCaleb Zulawski} 42*71dc3de5SCaleb Zulawski 43*71dc3de5SCaleb Zulawskidefine i8 @test_smax_v8i8(<8 x i8> %x) { 44*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_smax_v8i8: 45*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 46*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.s8 d16, d0, d0 47*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.s8 d16, d16, d16 48*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.s8 d16, d16, d16 49*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.s8 r0, d16[0] 50*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 51*71dc3de5SCaleb Zulawskientry: 52*71dc3de5SCaleb Zulawski %z = call i8 @llvm.vector.reduce.smax.v8i8(<8 x i8> %x) 53*71dc3de5SCaleb Zulawski ret i8 %z 54*71dc3de5SCaleb Zulawski} 55*71dc3de5SCaleb Zulawski 56*71dc3de5SCaleb Zulawskidefine i16 @test_umin_v4i16(<4 x i16> %x) { 57*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_umin_v4i16: 58*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 59*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u16 d16, d0, d0 60*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u16 d16, d16, d16 61*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.u16 r0, d16[0] 62*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 63*71dc3de5SCaleb Zulawskientry: 64*71dc3de5SCaleb Zulawski %z = call i16 @llvm.vector.reduce.umin.v4i16(<4 x i16> %x) 65*71dc3de5SCaleb Zulawski ret i16 %z 66*71dc3de5SCaleb Zulawski} 67*71dc3de5SCaleb Zulawski 68*71dc3de5SCaleb Zulawskidefine i16 @test_smin_v4i16(<4 x i16> %x) { 69*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_smin_v4i16: 70*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 71*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.s16 d16, d0, d0 72*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.s16 d16, d16, d16 73*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.s16 r0, d16[0] 74*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 75*71dc3de5SCaleb Zulawskientry: 76*71dc3de5SCaleb Zulawski %z = call i16 @llvm.vector.reduce.smin.v4i16(<4 x i16> %x) 77*71dc3de5SCaleb Zulawski ret i16 %z 78*71dc3de5SCaleb Zulawski} 79*71dc3de5SCaleb Zulawski 80*71dc3de5SCaleb Zulawskidefine i16 @test_umax_v4i16(<4 x i16> %x) { 81*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_umax_v4i16: 82*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 83*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.u16 d16, d0, d0 84*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.u16 d16, d16, d16 85*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.u16 r0, d16[0] 86*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 87*71dc3de5SCaleb Zulawskientry: 88*71dc3de5SCaleb Zulawski %z = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> %x) 89*71dc3de5SCaleb Zulawski ret i16 %z 90*71dc3de5SCaleb Zulawski} 91*71dc3de5SCaleb Zulawski 92*71dc3de5SCaleb Zulawskidefine i16 @test_smax_v4i16(<4 x i16> %x) { 93*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_smax_v4i16: 94*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 95*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.s16 d16, d0, d0 96*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.s16 d16, d16, d16 97*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.s16 r0, d16[0] 98*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 99*71dc3de5SCaleb Zulawskientry: 100*71dc3de5SCaleb Zulawski %z = call i16 @llvm.vector.reduce.smax.v4i16(<4 x i16> %x) 101*71dc3de5SCaleb Zulawski ret i16 %z 102*71dc3de5SCaleb Zulawski} 103*71dc3de5SCaleb Zulawski 104*71dc3de5SCaleb Zulawskidefine i32 @test_umin_v2i32(<2 x i32> %x) { 105*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_umin_v2i32: 106*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 107*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u32 d16, d0, d0 108*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.32 r0, d16[0] 109*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 110*71dc3de5SCaleb Zulawskientry: 111*71dc3de5SCaleb Zulawski %z = call i32 @llvm.vector.reduce.umin.v2i32(<2 x i32> %x) 112*71dc3de5SCaleb Zulawski ret i32 %z 113*71dc3de5SCaleb Zulawski} 114*71dc3de5SCaleb Zulawski 115*71dc3de5SCaleb Zulawskidefine i32 @test_smin_v2i32(<2 x i32> %x) { 116*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_smin_v2i32: 117*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 118*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.s32 d16, d0, d0 119*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.32 r0, d16[0] 120*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 121*71dc3de5SCaleb Zulawskientry: 122*71dc3de5SCaleb Zulawski %z = call i32 @llvm.vector.reduce.smin.v2i32(<2 x i32> %x) 123*71dc3de5SCaleb Zulawski ret i32 %z 124*71dc3de5SCaleb Zulawski} 125*71dc3de5SCaleb Zulawski 126*71dc3de5SCaleb Zulawskidefine i32 @test_umax_v2i32(<2 x i32> %x) { 127*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_umax_v2i32: 128*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 129*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.u32 d16, d0, d0 130*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.32 r0, d16[0] 131*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 132*71dc3de5SCaleb Zulawskientry: 133*71dc3de5SCaleb Zulawski %z = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> %x) 134*71dc3de5SCaleb Zulawski ret i32 %z 135*71dc3de5SCaleb Zulawski} 136*71dc3de5SCaleb Zulawski 137*71dc3de5SCaleb Zulawskidefine i32 @test_smax_v2i32(<2 x i32> %x) { 138*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_smax_v2i32: 139*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 140*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.s32 d16, d0, d0 141*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.32 r0, d16[0] 142*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 143*71dc3de5SCaleb Zulawskientry: 144*71dc3de5SCaleb Zulawski %z = call i32 @llvm.vector.reduce.smax.v2i32(<2 x i32> %x) 145*71dc3de5SCaleb Zulawski ret i32 %z 146*71dc3de5SCaleb Zulawski} 147*71dc3de5SCaleb Zulawski 148*71dc3de5SCaleb Zulawskidefine i8 @test_umin_v16i8(<16 x i8> %x) { 149*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_umin_v16i8: 150*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 151*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u8 d16, d0, d1 152*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u8 d16, d16, d16 153*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u8 d16, d16, d16 154*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u8 d16, d16, d16 155*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.u8 r0, d16[0] 156*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 157*71dc3de5SCaleb Zulawskientry: 158*71dc3de5SCaleb Zulawski %z = call i8 @llvm.vector.reduce.umin.v16i8(<16 x i8> %x) 159*71dc3de5SCaleb Zulawski ret i8 %z 160*71dc3de5SCaleb Zulawski} 161*71dc3de5SCaleb Zulawski 162*71dc3de5SCaleb Zulawskidefine i16 @test_smin_v8i16(<8 x i16> %x) { 163*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_smin_v8i16: 164*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 165*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.s16 d16, d0, d1 166*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.s16 d16, d16, d16 167*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.s16 d16, d16, d16 168*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.s16 r0, d16[0] 169*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 170*71dc3de5SCaleb Zulawskientry: 171*71dc3de5SCaleb Zulawski %z = call i16 @llvm.vector.reduce.smin.v8i16(<8 x i16> %x) 172*71dc3de5SCaleb Zulawski ret i16 %z 173*71dc3de5SCaleb Zulawski} 174*71dc3de5SCaleb Zulawski 175*71dc3de5SCaleb Zulawskidefine i32 @test_umax_v4i32(<4 x i32> %x) { 176*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_umax_v4i32: 177*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 178*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.u32 d16, d0, d1 179*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmax.u32 d16, d16, d16 180*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.32 r0, d16[0] 181*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 182*71dc3de5SCaleb Zulawskientry: 183*71dc3de5SCaleb Zulawski %z = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> %x) 184*71dc3de5SCaleb Zulawski ret i32 %z 185*71dc3de5SCaleb Zulawski} 186*71dc3de5SCaleb Zulawski 187*71dc3de5SCaleb Zulawskidefine i8 @test_umin_v32i8(<32 x i8> %x) { 188*71dc3de5SCaleb Zulawski; CHECK-LABEL: test_umin_v32i8: 189*71dc3de5SCaleb Zulawski; CHECK: @ %bb.0: @ %entry 190*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmin.u8 q8, q0, q1 191*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u8 d16, d16, d17 192*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u8 d16, d16, d16 193*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u8 d16, d16, d16 194*71dc3de5SCaleb Zulawski; CHECK-NEXT: vpmin.u8 d16, d16, d16 195*71dc3de5SCaleb Zulawski; CHECK-NEXT: vmov.u8 r0, d16[0] 196*71dc3de5SCaleb Zulawski; CHECK-NEXT: bx lr 197*71dc3de5SCaleb Zulawskientry: 198*71dc3de5SCaleb Zulawski %z = call i8 @llvm.vector.reduce.umin.v32i8(<32 x i8> %x) 199*71dc3de5SCaleb Zulawski ret i8 %z 200*71dc3de5SCaleb Zulawski} 201*71dc3de5SCaleb Zulawski 202*71dc3de5SCaleb Zulawskideclare i8 @llvm.vector.reduce.umin.v8i8(<8 x i8>) 203*71dc3de5SCaleb Zulawskideclare i8 @llvm.vector.reduce.smin.v8i8(<8 x i8>) 204*71dc3de5SCaleb Zulawskideclare i8 @llvm.vector.reduce.umax.v8i8(<8 x i8>) 205*71dc3de5SCaleb Zulawskideclare i8 @llvm.vector.reduce.smax.v8i8(<8 x i8>) 206*71dc3de5SCaleb Zulawskideclare i16 @llvm.vector.reduce.umin.v4i16(<4 x i16>) 207*71dc3de5SCaleb Zulawskideclare i16 @llvm.vector.reduce.smin.v4i16(<4 x i16>) 208*71dc3de5SCaleb Zulawskideclare i16 @llvm.vector.reduce.umax.v4i16(<4 x i16>) 209*71dc3de5SCaleb Zulawskideclare i16 @llvm.vector.reduce.smax.v4i16(<4 x i16>) 210*71dc3de5SCaleb Zulawskideclare i32 @llvm.vector.reduce.umin.v2i32(<2 x i32>) 211*71dc3de5SCaleb Zulawskideclare i32 @llvm.vector.reduce.smin.v2i32(<2 x i32>) 212*71dc3de5SCaleb Zulawskideclare i32 @llvm.vector.reduce.umax.v2i32(<2 x i32>) 213*71dc3de5SCaleb Zulawskideclare i32 @llvm.vector.reduce.smax.v2i32(<2 x i32>) 214*71dc3de5SCaleb Zulawski 215*71dc3de5SCaleb Zulawskideclare i8 @llvm.vector.reduce.umin.v16i8(<16 x i8>) 216*71dc3de5SCaleb Zulawskideclare i16 @llvm.vector.reduce.smin.v8i16(<8 x i16>) 217*71dc3de5SCaleb Zulawskideclare i32 @llvm.vector.reduce.umax.v4i32(<4 x i32>) 218*71dc3de5SCaleb Zulawski 219*71dc3de5SCaleb Zulawskideclare i8 @llvm.vector.reduce.umin.v32i8(<32 x i8>) 220