1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s 3 4define arm_aapcs_vfpcc <8 x i16> @vqmovni32_sminmax_t1(<4 x i32> %s0, <8 x i16> %src1) { 5; CHECK-LABEL: vqmovni32_sminmax_t1: 6; CHECK: @ %bb.0: @ %entry 7; CHECK-NEXT: vqmovnt.s32 q1, q0 8; CHECK-NEXT: vmov q0, q1 9; CHECK-NEXT: bx lr 10entry: 11 %c1 = icmp sgt <4 x i32> %s0, <i32 -32768, i32 -32768, i32 -32768, i32 -32768> 12 %s1 = select <4 x i1> %c1, <4 x i32> %s0, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768> 13 %c2 = icmp slt <4 x i32> %s1, <i32 32767, i32 32767, i32 32767, i32 32767> 14 %s2 = select <4 x i1> %c2, <4 x i32> %s1, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767> 15 %src2 = bitcast <4 x i32> %s2 to <8 x i16> 16 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14> 17 ret <8 x i16> %out 18} 19 20define arm_aapcs_vfpcc <8 x i16> @vqmovni32_sminmax_t2(<4 x i32> %s0, <8 x i16> %src1) { 21; CHECK-LABEL: vqmovni32_sminmax_t2: 22; CHECK: @ %bb.0: @ %entry 23; CHECK-NEXT: vqmovnb.s32 q0, q0 24; CHECK-NEXT: vmovnt.i32 q0, q1 25; CHECK-NEXT: bx lr 26entry: 27 %c1 = icmp sgt <4 x i32> %s0, <i32 -32768, i32 -32768, i32 -32768, i32 -32768> 28 %s1 = select <4 x i1> %c1, <4 x i32> %s0, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768> 29 %c2 = icmp slt <4 x i32> %s1, <i32 32767, i32 32767, i32 32767, i32 32767> 30 %s2 = select <4 x i1> %c2, <4 x i32> %s1, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767> 31 %src2 = bitcast <4 x i32> %s2 to <8 x i16> 32 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 8, i32 0, i32 10, i32 2, i32 12, i32 4, i32 14, i32 6> 33 ret <8 x i16> %out 34} 35 36define arm_aapcs_vfpcc <8 x i16> @vqmovni32_sminmax_b1(<4 x i32> %s0, <8 x i16> %src1) { 37; CHECK-LABEL: vqmovni32_sminmax_b1: 38; CHECK: @ %bb.0: @ %entry 39; CHECK-NEXT: vqmovnb.s32 q1, q0 40; CHECK-NEXT: vmov q0, q1 41; CHECK-NEXT: bx lr 42entry: 43 %c1 = icmp sgt <4 x i32> %s0, <i32 -32768, i32 -32768, i32 -32768, i32 -32768> 44 %s1 = select <4 x i1> %c1, <4 x i32> %s0, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768> 45 %c2 = icmp slt <4 x i32> %s1, <i32 32767, i32 32767, i32 32767, i32 32767> 46 %s2 = select <4 x i1> %c2, <4 x i32> %s1, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767> 47 %src2 = bitcast <4 x i32> %s2 to <8 x i16> 48 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7> 49 ret <8 x i16> %out 50} 51 52define arm_aapcs_vfpcc <8 x i16> @vqmovni32_sminmax_b2(<4 x i32> %s0, <8 x i16> %src1) { 53; CHECK-LABEL: vqmovni32_sminmax_b2: 54; CHECK: @ %bb.0: @ %entry 55; CHECK-NEXT: vqmovnb.s32 q0, q0 56; CHECK-NEXT: vmovlb.s16 q0, q0 57; CHECK-NEXT: vmovnb.i32 q0, q1 58; CHECK-NEXT: bx lr 59entry: 60 %c1 = icmp sgt <4 x i32> %s0, <i32 -32768, i32 -32768, i32 -32768, i32 -32768> 61 %s1 = select <4 x i1> %c1, <4 x i32> %s0, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768> 62 %c2 = icmp slt <4 x i32> %s1, <i32 32767, i32 32767, i32 32767, i32 32767> 63 %s2 = select <4 x i1> %c2, <4 x i32> %s1, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767> 64 %src2 = bitcast <4 x i32> %s2 to <8 x i16> 65 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15> 66 ret <8 x i16> %out 67} 68 69 70define arm_aapcs_vfpcc <8 x i16> @vqmovni32_uminmax_t1(<4 x i32> %s0, <8 x i16> %src1) { 71; CHECK-LABEL: vqmovni32_uminmax_t1: 72; CHECK: @ %bb.0: @ %entry 73; CHECK-NEXT: vqmovnb.u32 q0, q0 74; CHECK-NEXT: vmovlb.u16 q0, q0 75; CHECK-NEXT: vmovnt.i32 q1, q0 76; CHECK-NEXT: vmov q0, q1 77; CHECK-NEXT: bx lr 78entry: 79 %c2 = icmp ult <4 x i32> %s0, <i32 65535, i32 65535, i32 65535, i32 65535> 80 %s2 = select <4 x i1> %c2, <4 x i32> %s0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535> 81 %src2 = bitcast <4 x i32> %s2 to <8 x i16> 82 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14> 83 ret <8 x i16> %out 84} 85 86define arm_aapcs_vfpcc <8 x i16> @vqmovni32_uminmax_t2(<4 x i32> %s0, <8 x i16> %src1) { 87; CHECK-LABEL: vqmovni32_uminmax_t2: 88; CHECK: @ %bb.0: @ %entry 89; CHECK-NEXT: vqmovnb.u32 q0, q0 90; CHECK-NEXT: vmovlb.u16 q0, q0 91; CHECK-NEXT: vmovnt.i32 q0, q1 92; CHECK-NEXT: bx lr 93entry: 94 %c2 = icmp ult <4 x i32> %s0, <i32 65535, i32 65535, i32 65535, i32 65535> 95 %s2 = select <4 x i1> %c2, <4 x i32> %s0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535> 96 %src2 = bitcast <4 x i32> %s2 to <8 x i16> 97 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 8, i32 0, i32 10, i32 2, i32 12, i32 4, i32 14, i32 6> 98 ret <8 x i16> %out 99} 100 101define arm_aapcs_vfpcc <8 x i16> @vqmovni32_uminmax_b1(<4 x i32> %s0, <8 x i16> %src1) { 102; CHECK-LABEL: vqmovni32_uminmax_b1: 103; CHECK: @ %bb.0: @ %entry 104; CHECK-NEXT: vqmovnb.u32 q0, q0 105; CHECK-NEXT: vmovlb.u16 q0, q0 106; CHECK-NEXT: vmovnb.i32 q1, q0 107; CHECK-NEXT: vmov q0, q1 108; CHECK-NEXT: bx lr 109entry: 110 %c2 = icmp ult <4 x i32> %s0, <i32 65535, i32 65535, i32 65535, i32 65535> 111 %s2 = select <4 x i1> %c2, <4 x i32> %s0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535> 112 %src2 = bitcast <4 x i32> %s2 to <8 x i16> 113 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7> 114 ret <8 x i16> %out 115} 116 117define arm_aapcs_vfpcc <8 x i16> @vqmovni32_uminmax_b2(<4 x i32> %s0, <8 x i16> %src1) { 118; CHECK-LABEL: vqmovni32_uminmax_b2: 119; CHECK: @ %bb.0: @ %entry 120; CHECK-NEXT: vmov.i32 q0, #0x0 121; CHECK-NEXT: vmovnb.i32 q0, q1 122; CHECK-NEXT: bx lr 123entry: 124 %c2 = icmp ult <4 x i32> %s0, <i32 65535, i32 65535, i32 65535, i32 65535> 125 %s2 = select <4 x i1> %c2, <4 x i32> %s0, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535> 126 %src2 = bitcast <4 x i32> %s2 to <8 x i16> 127 %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15> 128 ret <8 x i16> %out 129} 130 131 132define arm_aapcs_vfpcc <16 x i8> @vqmovni16_sminmax_t1(<8 x i16> %s0, <16 x i8> %src1) { 133; CHECK-LABEL: vqmovni16_sminmax_t1: 134; CHECK: @ %bb.0: @ %entry 135; CHECK-NEXT: vqmovnt.s16 q1, q0 136; CHECK-NEXT: vmov q0, q1 137; CHECK-NEXT: bx lr 138entry: 139 %c1 = icmp sgt <8 x i16> %s0, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 140 %s1 = select <8 x i1> %c1, <8 x i16> %s0, <8 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 141 %c2 = icmp slt <8 x i16> %s1, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 142 %s2 = select <8 x i1> %c2, <8 x i16> %s1, <8 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 143 %src2 = bitcast <8 x i16> %s2 to <16 x i8> 144 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30> 145 ret <16 x i8> %out 146} 147 148define arm_aapcs_vfpcc <16 x i8> @vqmovni16_sminmax_t2(<8 x i16> %s0, <16 x i8> %src1) { 149; CHECK-LABEL: vqmovni16_sminmax_t2: 150; CHECK: @ %bb.0: @ %entry 151; CHECK-NEXT: vqmovnb.s16 q0, q0 152; CHECK-NEXT: vmovnt.i16 q0, q1 153; CHECK-NEXT: bx lr 154entry: 155 %c1 = icmp sgt <8 x i16> %s0, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 156 %s1 = select <8 x i1> %c1, <8 x i16> %s0, <8 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 157 %c2 = icmp slt <8 x i16> %s1, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 158 %s2 = select <8 x i1> %c2, <8 x i16> %s1, <8 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 159 %src2 = bitcast <8 x i16> %s2 to <16 x i8> 160 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 16, i32 0, i32 18, i32 2, i32 20, i32 4, i32 22, i32 6, i32 24, i32 8, i32 26, i32 10, i32 28, i32 12, i32 30, i32 14> 161 ret <16 x i8> %out 162} 163 164define arm_aapcs_vfpcc <16 x i8> @vqmovni16_sminmax_b1(<8 x i16> %s0, <16 x i8> %src1) { 165; CHECK-LABEL: vqmovni16_sminmax_b1: 166; CHECK: @ %bb.0: @ %entry 167; CHECK-NEXT: vqmovnb.s16 q1, q0 168; CHECK-NEXT: vmov q0, q1 169; CHECK-NEXT: bx lr 170entry: 171 %c1 = icmp sgt <8 x i16> %s0, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 172 %s1 = select <8 x i1> %c1, <8 x i16> %s0, <8 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 173 %c2 = icmp slt <8 x i16> %s1, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 174 %s2 = select <8 x i1> %c2, <8 x i16> %s1, <8 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 175 %src2 = bitcast <8 x i16> %s2 to <16 x i8> 176 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 16, i32 1, i32 18, i32 3, i32 20, i32 5, i32 22, i32 7, i32 24, i32 9, i32 26, i32 11, i32 28, i32 13, i32 30, i32 15> 177 ret <16 x i8> %out 178} 179 180define arm_aapcs_vfpcc <16 x i8> @vqmovni16_sminmax_b2(<8 x i16> %s0, <16 x i8> %src1) { 181; CHECK-LABEL: vqmovni16_sminmax_b2: 182; CHECK: @ %bb.0: @ %entry 183; CHECK-NEXT: vqmovnb.s16 q0, q0 184; CHECK-NEXT: vmovlb.s8 q0, q0 185; CHECK-NEXT: vmovnb.i16 q0, q1 186; CHECK-NEXT: bx lr 187entry: 188 %c1 = icmp sgt <8 x i16> %s0, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 189 %s1 = select <8 x i1> %c1, <8 x i16> %s0, <8 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 190 %c2 = icmp slt <8 x i16> %s1, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 191 %s2 = select <8 x i1> %c2, <8 x i16> %s1, <8 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 192 %src2 = bitcast <8 x i16> %s2 to <16 x i8> 193 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 0, i32 17, i32 2, i32 19, i32 4, i32 21, i32 6, i32 23, i32 8, i32 25, i32 10, i32 27, i32 12, i32 29, i32 14, i32 31> 194 ret <16 x i8> %out 195} 196 197 198define arm_aapcs_vfpcc <16 x i8> @vqmovni16_uminmax_t1(<8 x i16> %s0, <16 x i8> %src1) { 199; CHECK-LABEL: vqmovni16_uminmax_t1: 200; CHECK: @ %bb.0: @ %entry 201; CHECK-NEXT: vqmovnb.u16 q0, q0 202; CHECK-NEXT: vmovlb.u8 q0, q0 203; CHECK-NEXT: vmovnt.i16 q1, q0 204; CHECK-NEXT: vmov q0, q1 205; CHECK-NEXT: bx lr 206entry: 207 %c2 = icmp ult <8 x i16> %s0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 208 %s2 = select <8 x i1> %c2, <8 x i16> %s0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 209 %src2 = bitcast <8 x i16> %s2 to <16 x i8> 210 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30> 211 ret <16 x i8> %out 212} 213 214define arm_aapcs_vfpcc <16 x i8> @vqmovni16_uminmax_t2(<8 x i16> %s0, <16 x i8> %src1) { 215; CHECK-LABEL: vqmovni16_uminmax_t2: 216; CHECK: @ %bb.0: @ %entry 217; CHECK-NEXT: vqmovnb.u16 q0, q0 218; CHECK-NEXT: vmovlb.u8 q0, q0 219; CHECK-NEXT: vmovnt.i16 q0, q1 220; CHECK-NEXT: bx lr 221entry: 222 %c2 = icmp ult <8 x i16> %s0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 223 %s2 = select <8 x i1> %c2, <8 x i16> %s0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 224 %src2 = bitcast <8 x i16> %s2 to <16 x i8> 225 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 16, i32 0, i32 18, i32 2, i32 20, i32 4, i32 22, i32 6, i32 24, i32 8, i32 26, i32 10, i32 28, i32 12, i32 30, i32 14> 226 ret <16 x i8> %out 227} 228 229define arm_aapcs_vfpcc <16 x i8> @vqmovni16_uminmax_b1(<8 x i16> %s0, <16 x i8> %src1) { 230; CHECK-LABEL: vqmovni16_uminmax_b1: 231; CHECK: @ %bb.0: @ %entry 232; CHECK-NEXT: vqmovnb.u16 q0, q0 233; CHECK-NEXT: vmovlb.u8 q0, q0 234; CHECK-NEXT: vmovnb.i16 q1, q0 235; CHECK-NEXT: vmov q0, q1 236; CHECK-NEXT: bx lr 237entry: 238 %c2 = icmp ult <8 x i16> %s0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 239 %s2 = select <8 x i1> %c2, <8 x i16> %s0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 240 %src2 = bitcast <8 x i16> %s2 to <16 x i8> 241 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 16, i32 1, i32 18, i32 3, i32 20, i32 5, i32 22, i32 7, i32 24, i32 9, i32 26, i32 11, i32 28, i32 13, i32 30, i32 15> 242 ret <16 x i8> %out 243} 244 245define arm_aapcs_vfpcc <16 x i8> @vqmovni16_uminmax_b2(<8 x i16> %s0, <16 x i8> %src1) { 246; CHECK-LABEL: vqmovni16_uminmax_b2: 247; CHECK: @ %bb.0: @ %entry 248; CHECK-NEXT: vmov.i32 q0, #0x0 249; CHECK-NEXT: vmovnb.i16 q0, q1 250; CHECK-NEXT: bx lr 251entry: 252 %c2 = icmp ult <8 x i16> %s0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 253 %s2 = select <8 x i1> %c2, <8 x i16> %s0, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 254 %src2 = bitcast <8 x i16> %s2 to <16 x i8> 255 %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 0, i32 17, i32 2, i32 19, i32 4, i32 21, i32 6, i32 23, i32 8, i32 25, i32 10, i32 27, i32 12, i32 29, i32 14, i32 31> 256 ret <16 x i8> %out 257} 258