1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s 3 4define <8 x i8> @test_vext_s8(<8 x i8> %a, <8 x i8> %b) { 5; CHECK-LABEL: test_vext_s8: 6; CHECK: // %bb.0: // %entry 7; CHECK-NEXT: ext v0.8b, v0.8b, v1.8b, #2 8; CHECK-NEXT: ret 9entry: 10 %vext = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9> 11 ret <8 x i8> %vext 12} 13 14define <4 x i16> @test_vext_s16(<4 x i16> %a, <4 x i16> %b) { 15; CHECK-LABEL: test_vext_s16: 16; CHECK: // %bb.0: // %entry 17; CHECK-NEXT: ext v0.8b, v0.8b, v1.8b, #6 18; CHECK-NEXT: ret 19entry: 20 %vext = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 3, i32 4, i32 5, i32 6> 21 ret <4 x i16> %vext 22} 23 24define <2 x i32> @test_vext_s32(<2 x i32> %a, <2 x i32> %b) { 25; CHECK-LABEL: test_vext_s32: 26; CHECK: // %bb.0: // %entry 27; CHECK-NEXT: ext v0.8b, v0.8b, v1.8b, #4 28; CHECK-NEXT: ret 29entry: 30 %vext = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 2> 31 ret <2 x i32> %vext 32} 33 34define <1 x i64> @test_vext_s64(<1 x i64> %a, <1 x i64> %b) { 35; CHECK-LABEL: test_vext_s64: 36; CHECK: // %bb.0: // %entry 37; CHECK-NEXT: ret 38entry: 39 %vext = shufflevector <1 x i64> %a, <1 x i64> %b, <1 x i32> <i32 0> 40 ret <1 x i64> %vext 41} 42 43define <16 x i8> @test_vextq_s8(<16 x i8> %a, <16 x i8> %b) { 44; CHECK-LABEL: test_vextq_s8: 45; CHECK: // %bb.0: // %entry 46; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #2 47; CHECK-NEXT: ret 48entry: 49 %vext = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17> 50 ret <16 x i8> %vext 51} 52 53define <8 x i16> @test_vextq_s16(<8 x i16> %a, <8 x i16> %b) { 54; CHECK-LABEL: test_vextq_s16: 55; CHECK: // %bb.0: // %entry 56; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #6 57; CHECK-NEXT: ret 58entry: 59 %vext = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10> 60 ret <8 x i16> %vext 61} 62 63define <4 x i32> @test_vextq_s32(<4 x i32> %a, <4 x i32> %b) { 64; CHECK-LABEL: test_vextq_s32: 65; CHECK: // %bb.0: // %entry 66; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #4 67; CHECK-NEXT: ret 68entry: 69 %vext = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 70 ret <4 x i32> %vext 71} 72 73define <2 x i64> @test_vextq_s64(<2 x i64> %a, <2 x i64> %b) { 74; CHECK-LABEL: test_vextq_s64: 75; CHECK: // %bb.0: // %entry 76; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #8 77; CHECK-NEXT: ret 78entry: 79 %vext = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2> 80 ret <2 x i64> %vext 81} 82 83define <8 x i8> @test_vext_u8(<8 x i8> %a, <8 x i8> %b) { 84; CHECK-LABEL: test_vext_u8: 85; CHECK: // %bb.0: // %entry 86; CHECK-NEXT: ext v0.8b, v0.8b, v1.8b, #2 87; CHECK-NEXT: ret 88entry: 89 %vext = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9> 90 ret <8 x i8> %vext 91} 92 93define <4 x i16> @test_vext_u16(<4 x i16> %a, <4 x i16> %b) { 94; CHECK-LABEL: test_vext_u16: 95; CHECK: // %bb.0: // %entry 96; CHECK-NEXT: ext v0.8b, v0.8b, v1.8b, #6 97; CHECK-NEXT: ret 98entry: 99 %vext = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 3, i32 4, i32 5, i32 6> 100 ret <4 x i16> %vext 101} 102 103define <2 x i32> @test_vext_u32(<2 x i32> %a, <2 x i32> %b) { 104; CHECK-LABEL: test_vext_u32: 105; CHECK: // %bb.0: // %entry 106; CHECK-NEXT: ext v0.8b, v0.8b, v1.8b, #4 107; CHECK-NEXT: ret 108entry: 109 %vext = shufflevector <2 x i32> %a, <2 x i32> %b, <2 x i32> <i32 1, i32 2> 110 ret <2 x i32> %vext 111} 112 113define <1 x i64> @test_vext_u64(<1 x i64> %a, <1 x i64> %b) { 114; CHECK-LABEL: test_vext_u64: 115; CHECK: // %bb.0: // %entry 116; CHECK-NEXT: ret 117entry: 118 %vext = shufflevector <1 x i64> %a, <1 x i64> %b, <1 x i32> <i32 0> 119 ret <1 x i64> %vext 120} 121 122define <16 x i8> @test_vextq_u8(<16 x i8> %a, <16 x i8> %b) { 123; CHECK-LABEL: test_vextq_u8: 124; CHECK: // %bb.0: // %entry 125; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #2 126; CHECK-NEXT: ret 127entry: 128 %vext = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17> 129 ret <16 x i8> %vext 130} 131 132define <8 x i16> @test_vextq_u16(<8 x i16> %a, <8 x i16> %b) { 133; CHECK-LABEL: test_vextq_u16: 134; CHECK: // %bb.0: // %entry 135; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #6 136; CHECK-NEXT: ret 137entry: 138 %vext = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10> 139 ret <8 x i16> %vext 140} 141 142define <4 x i32> @test_vextq_u32(<4 x i32> %a, <4 x i32> %b) { 143; CHECK-LABEL: test_vextq_u32: 144; CHECK: // %bb.0: // %entry 145; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #4 146; CHECK-NEXT: ret 147entry: 148 %vext = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 149 ret <4 x i32> %vext 150} 151 152define <2 x i64> @test_vextq_u64(<2 x i64> %a, <2 x i64> %b) { 153; CHECK-LABEL: test_vextq_u64: 154; CHECK: // %bb.0: // %entry 155; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #8 156; CHECK-NEXT: ret 157entry: 158 %vext = shufflevector <2 x i64> %a, <2 x i64> %b, <2 x i32> <i32 1, i32 2> 159 ret <2 x i64> %vext 160} 161 162define <2 x float> @test_vext_f32(<2 x float> %a, <2 x float> %b) { 163; CHECK-LABEL: test_vext_f32: 164; CHECK: // %bb.0: // %entry 165; CHECK-NEXT: ext v0.8b, v0.8b, v1.8b, #4 166; CHECK-NEXT: ret 167entry: 168 %vext = shufflevector <2 x float> %a, <2 x float> %b, <2 x i32> <i32 1, i32 2> 169 ret <2 x float> %vext 170} 171 172define <1 x double> @test_vext_f64(<1 x double> %a, <1 x double> %b) { 173; CHECK-LABEL: test_vext_f64: 174; CHECK: // %bb.0: // %entry 175; CHECK-NEXT: ret 176entry: 177 %vext = shufflevector <1 x double> %a, <1 x double> %b, <1 x i32> <i32 0> 178 ret <1 x double> %vext 179} 180 181define <4 x float> @test_vextq_f32(<4 x float> %a, <4 x float> %b) { 182; CHECK-LABEL: test_vextq_f32: 183; CHECK: // %bb.0: // %entry 184; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #4 185; CHECK-NEXT: ret 186entry: 187 %vext = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 1, i32 2, i32 3, i32 4> 188 ret <4 x float> %vext 189} 190 191define <2 x double> @test_vextq_f64(<2 x double> %a, <2 x double> %b) { 192; CHECK-LABEL: test_vextq_f64: 193; CHECK: // %bb.0: // %entry 194; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #8 195; CHECK-NEXT: ret 196entry: 197 %vext = shufflevector <2 x double> %a, <2 x double> %b, <2 x i32> <i32 1, i32 2> 198 ret <2 x double> %vext 199} 200 201define <8 x i8> @test_vext_p8(<8 x i8> %a, <8 x i8> %b) { 202; CHECK-LABEL: test_vext_p8: 203; CHECK: // %bb.0: // %entry 204; CHECK-NEXT: ext v0.8b, v0.8b, v1.8b, #2 205; CHECK-NEXT: ret 206entry: 207 %vext = shufflevector <8 x i8> %a, <8 x i8> %b, <8 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9> 208 ret <8 x i8> %vext 209} 210 211define <4 x i16> @test_vext_p16(<4 x i16> %a, <4 x i16> %b) { 212; CHECK-LABEL: test_vext_p16: 213; CHECK: // %bb.0: // %entry 214; CHECK-NEXT: ext v0.8b, v0.8b, v1.8b, #6 215; CHECK-NEXT: ret 216entry: 217 %vext = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 3, i32 4, i32 5, i32 6> 218 ret <4 x i16> %vext 219} 220 221define <16 x i8> @test_vextq_p8(<16 x i8> %a, <16 x i8> %b) { 222; CHECK-LABEL: test_vextq_p8: 223; CHECK: // %bb.0: // %entry 224; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #2 225; CHECK-NEXT: ret 226entry: 227 %vext = shufflevector <16 x i8> %a, <16 x i8> %b, <16 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17> 228 ret <16 x i8> %vext 229} 230 231define <8 x i16> @test_vextq_p16(<8 x i16> %a, <8 x i16> %b) { 232; CHECK-LABEL: test_vextq_p16: 233; CHECK: // %bb.0: // %entry 234; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #6 235; CHECK-NEXT: ret 236entry: 237 %vext = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10> 238 ret <8 x i16> %vext 239} 240 241define <8 x i8> @test_undef_vext_s8(<8 x i8> %a) { 242; CHECK-LABEL: test_undef_vext_s8: 243; CHECK: // %bb.0: // %entry 244; CHECK-NEXT: ext v0.8b, v0.8b, v0.8b, #2 245; CHECK-NEXT: ret 246entry: 247 %vext = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 10, i32 10, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9> 248 ret <8 x i8> %vext 249} 250 251define <16 x i8> @test_undef_vextq_s8(<16 x i8> %a) { 252; CHECK-LABEL: test_undef_vextq_s8: 253; CHECK: // %bb.0: // %entry 254; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #6 255; CHECK-NEXT: ret 256entry: 257 %vext = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 20, i32 20, i32 20, i32 20, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 20, i32 20, i32 20, i32 20, i32 20> 258 ret <16 x i8> %vext 259} 260 261define <4 x i16> @test_undef_vext_s16(<4 x i16> %a) { 262; CHECK-LABEL: test_undef_vext_s16: 263; CHECK: // %bb.0: // %entry 264; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 265; CHECK-NEXT: dup v0.2s, v0.s[1] 266; CHECK-NEXT: ret 267entry: 268 %vext = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 2, i32 3, i32 4, i32 5> 269 ret <4 x i16> %vext 270} 271 272define <8 x i16> @test_undef_vextq_s16(<8 x i16> %a) { 273; CHECK-LABEL: test_undef_vextq_s16: 274; CHECK: // %bb.0: // %entry 275; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #6 276; CHECK-NEXT: ret 277entry: 278 %vext = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 10, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10> 279 ret <8 x i16> %vext 280} 281