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: vqmovnt.u16 q1, q0 202; CHECK-NEXT: vmov q0, q1 203; CHECK-NEXT: bx lr 204entry: 205 %c2 = icmp ult <8 x i16> %s0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 206 %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> 207 %src2 = bitcast <8 x i16> %s2 to <16 x i8> 208 %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> 209 ret <16 x i8> %out 210} 211 212define arm_aapcs_vfpcc <16 x i8> @vqmovni16_uminmax_t2(<8 x i16> %s0, <16 x i8> %src1) { 213; CHECK-LABEL: vqmovni16_uminmax_t2: 214; CHECK: @ %bb.0: @ %entry 215; CHECK-NEXT: vqmovnb.u16 q0, q0 216; CHECK-NEXT: vmovnt.i16 q0, q1 217; CHECK-NEXT: bx lr 218entry: 219 %c2 = icmp ult <8 x i16> %s0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 220 %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> 221 %src2 = bitcast <8 x i16> %s2 to <16 x i8> 222 %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> 223 ret <16 x i8> %out 224} 225 226define arm_aapcs_vfpcc <16 x i8> @vqmovni16_uminmax_b1(<8 x i16> %s0, <16 x i8> %src1) { 227; CHECK-LABEL: vqmovni16_uminmax_b1: 228; CHECK: @ %bb.0: @ %entry 229; CHECK-NEXT: vqmovnb.u16 q1, q0 230; CHECK-NEXT: vmov q0, q1 231; CHECK-NEXT: bx lr 232entry: 233 %c2 = icmp ult <8 x i16> %s0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 234 %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> 235 %src2 = bitcast <8 x i16> %s2 to <16 x i8> 236 %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> 237 ret <16 x i8> %out 238} 239 240define arm_aapcs_vfpcc <16 x i8> @vqmovni16_uminmax_b2(<8 x i16> %s0, <16 x i8> %src1) { 241; CHECK-LABEL: vqmovni16_uminmax_b2: 242; CHECK: @ %bb.0: @ %entry 243; CHECK-NEXT: vmov.i32 q0, #0x0 244; CHECK-NEXT: vmovnb.i16 q0, q1 245; CHECK-NEXT: bx lr 246entry: 247 %c2 = icmp ult <8 x i16> %s0, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 248 %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> 249 %src2 = bitcast <8 x i16> %s2 to <16 x i8> 250 %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> 251 ret <16 x i8> %out 252} 253