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