1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s 3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s 4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE 5 6target triple = "aarch64-unknown-linux-gnu" 7 8; i1 9 10define <4 x i1> @extract_subvector_v8i1(<8 x i1> %op) { 11; CHECK-LABEL: extract_subvector_v8i1: 12; CHECK: // %bb.0: 13; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 14; CHECK-NEXT: mov z1.b, z0.b[7] 15; CHECK-NEXT: mov z2.b, z0.b[6] 16; CHECK-NEXT: mov z3.b, z0.b[5] 17; CHECK-NEXT: mov z0.b, z0.b[4] 18; CHECK-NEXT: zip1 z1.h, z2.h, z1.h 19; CHECK-NEXT: zip1 z0.h, z0.h, z3.h 20; CHECK-NEXT: zip1 z0.s, z0.s, z1.s 21; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 22; CHECK-NEXT: ret 23; 24; NONEON-NOSVE-LABEL: extract_subvector_v8i1: 25; NONEON-NOSVE: // %bb.0: 26; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 27; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 28; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7] 29; NONEON-NOSVE-NEXT: strh w8, [sp, #14] 30; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6] 31; NONEON-NOSVE-NEXT: strh w8, [sp, #12] 32; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5] 33; NONEON-NOSVE-NEXT: strh w8, [sp, #10] 34; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4] 35; NONEON-NOSVE-NEXT: strh w8, [sp, #8] 36; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 37; NONEON-NOSVE-NEXT: add sp, sp, #16 38; NONEON-NOSVE-NEXT: ret 39 %ret = call <4 x i1> @llvm.vector.extract.v4i1.v8i1(<8 x i1> %op, i64 4) 40 ret <4 x i1> %ret 41} 42 43; i8 44 45define <4 x i8> @extract_subvector_v8i8(<8 x i8> %op) { 46; CHECK-LABEL: extract_subvector_v8i8: 47; CHECK: // %bb.0: 48; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 49; CHECK-NEXT: mov z1.b, z0.b[7] 50; CHECK-NEXT: mov z2.b, z0.b[6] 51; CHECK-NEXT: mov z3.b, z0.b[5] 52; CHECK-NEXT: mov z0.b, z0.b[4] 53; CHECK-NEXT: zip1 z1.h, z2.h, z1.h 54; CHECK-NEXT: zip1 z0.h, z0.h, z3.h 55; CHECK-NEXT: zip1 z0.s, z0.s, z1.s 56; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 57; CHECK-NEXT: ret 58; 59; NONEON-NOSVE-LABEL: extract_subvector_v8i8: 60; NONEON-NOSVE: // %bb.0: 61; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 62; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 63; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7] 64; NONEON-NOSVE-NEXT: strh w8, [sp, #14] 65; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6] 66; NONEON-NOSVE-NEXT: strh w8, [sp, #12] 67; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5] 68; NONEON-NOSVE-NEXT: strh w8, [sp, #10] 69; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4] 70; NONEON-NOSVE-NEXT: strh w8, [sp, #8] 71; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 72; NONEON-NOSVE-NEXT: add sp, sp, #16 73; NONEON-NOSVE-NEXT: ret 74 %ret = call <4 x i8> @llvm.vector.extract.v4i8.v8i8(<8 x i8> %op, i64 4) 75 ret <4 x i8> %ret 76} 77 78define <8 x i8> @extract_subvector_v16i8(<16 x i8> %op) { 79; CHECK-LABEL: extract_subvector_v16i8: 80; CHECK: // %bb.0: 81; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 82; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 83; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 84; CHECK-NEXT: ret 85; 86; NONEON-NOSVE-LABEL: extract_subvector_v16i8: 87; NONEON-NOSVE: // %bb.0: 88; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 89; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 90; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 91; NONEON-NOSVE-NEXT: add sp, sp, #16 92; NONEON-NOSVE-NEXT: ret 93 %ret = call <8 x i8> @llvm.vector.extract.v8i8.v16i8(<16 x i8> %op, i64 8) 94 ret <8 x i8> %ret 95} 96 97define void @extract_subvector_v32i8(ptr %a, ptr %b) { 98; CHECK-LABEL: extract_subvector_v32i8: 99; CHECK: // %bb.0: 100; CHECK-NEXT: ldr q0, [x0, #16] 101; CHECK-NEXT: str q0, [x1] 102; CHECK-NEXT: ret 103; 104; NONEON-NOSVE-LABEL: extract_subvector_v32i8: 105; NONEON-NOSVE: // %bb.0: 106; NONEON-NOSVE-NEXT: ldr q0, [x0, #16] 107; NONEON-NOSVE-NEXT: str q0, [x1] 108; NONEON-NOSVE-NEXT: ret 109 %op = load <32 x i8>, ptr %a 110 %ret = call <16 x i8> @llvm.vector.extract.v16i8.v32i8(<32 x i8> %op, i64 16) 111 store <16 x i8> %ret, ptr %b 112 ret void 113} 114 115; i16 116 117define <2 x i16> @extract_subvector_v4i16(<4 x i16> %op) { 118; CHECK-LABEL: extract_subvector_v4i16: 119; CHECK: // %bb.0: 120; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 121; CHECK-NEXT: uunpklo z0.s, z0.h 122; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 123; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 124; CHECK-NEXT: ret 125; 126; NONEON-NOSVE-LABEL: extract_subvector_v4i16: 127; NONEON-NOSVE: // %bb.0: 128; NONEON-NOSVE-NEXT: ushll v0.4s, v0.4h, #0 129; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 130; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 131; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 132; NONEON-NOSVE-NEXT: add sp, sp, #16 133; NONEON-NOSVE-NEXT: ret 134 %ret = call <2 x i16> @llvm.vector.extract.v2i16.v4i16(<4 x i16> %op, i64 2) 135 ret <2 x i16> %ret 136} 137 138define <4 x i16> @extract_subvector_v8i16(<8 x i16> %op) { 139; CHECK-LABEL: extract_subvector_v8i16: 140; CHECK: // %bb.0: 141; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 142; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 143; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 144; CHECK-NEXT: ret 145; 146; NONEON-NOSVE-LABEL: extract_subvector_v8i16: 147; NONEON-NOSVE: // %bb.0: 148; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 149; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 150; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 151; NONEON-NOSVE-NEXT: add sp, sp, #16 152; NONEON-NOSVE-NEXT: ret 153 %ret = call <4 x i16> @llvm.vector.extract.v4i16.v8i16(<8 x i16> %op, i64 4) 154 ret <4 x i16> %ret 155} 156 157define void @extract_subvector_v16i16(ptr %a, ptr %b) { 158; CHECK-LABEL: extract_subvector_v16i16: 159; CHECK: // %bb.0: 160; CHECK-NEXT: ldr q0, [x0, #16] 161; CHECK-NEXT: str q0, [x1] 162; CHECK-NEXT: ret 163; 164; NONEON-NOSVE-LABEL: extract_subvector_v16i16: 165; NONEON-NOSVE: // %bb.0: 166; NONEON-NOSVE-NEXT: ldr q0, [x0, #16] 167; NONEON-NOSVE-NEXT: str q0, [x1] 168; NONEON-NOSVE-NEXT: ret 169 %op = load <16 x i16>, ptr %a 170 %ret = call <8 x i16> @llvm.vector.extract.v8i16.v16i16(<16 x i16> %op, i64 8) 171 store <8 x i16> %ret, ptr %b 172 ret void 173} 174 175; i32 176 177define <1 x i32> @extract_subvector_v2i32(<2 x i32> %op) { 178; CHECK-LABEL: extract_subvector_v2i32: 179; CHECK: // %bb.0: 180; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 181; CHECK-NEXT: mov z0.s, z0.s[1] 182; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 183; CHECK-NEXT: ret 184; 185; NONEON-NOSVE-LABEL: extract_subvector_v2i32: 186; NONEON-NOSVE: // %bb.0: 187; NONEON-NOSVE-NEXT: sub sp, sp, #16 188; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 189; NONEON-NOSVE-NEXT: str d0, [sp, #8] 190; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] 191; NONEON-NOSVE-NEXT: str w8, [sp] 192; NONEON-NOSVE-NEXT: ldr d0, [sp], #16 193; NONEON-NOSVE-NEXT: ret 194 %ret = call <1 x i32> @llvm.vector.extract.v1i32.v2i32(<2 x i32> %op, i64 1) 195 ret <1 x i32> %ret 196} 197 198define <2 x i32> @extract_subvector_v4i32(<4 x i32> %op) { 199; CHECK-LABEL: extract_subvector_v4i32: 200; CHECK: // %bb.0: 201; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 202; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 203; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 204; CHECK-NEXT: ret 205; 206; NONEON-NOSVE-LABEL: extract_subvector_v4i32: 207; NONEON-NOSVE: // %bb.0: 208; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 209; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 210; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 211; NONEON-NOSVE-NEXT: add sp, sp, #16 212; NONEON-NOSVE-NEXT: ret 213 %ret = call <2 x i32> @llvm.vector.extract.v2i32.v4i32(<4 x i32> %op, i64 2) 214 ret <2 x i32> %ret 215} 216 217define void @extract_subvector_v8i32(ptr %a, ptr %b) { 218; CHECK-LABEL: extract_subvector_v8i32: 219; CHECK: // %bb.0: 220; CHECK-NEXT: ldr q0, [x0, #16] 221; CHECK-NEXT: str q0, [x1] 222; CHECK-NEXT: ret 223; 224; NONEON-NOSVE-LABEL: extract_subvector_v8i32: 225; NONEON-NOSVE: // %bb.0: 226; NONEON-NOSVE-NEXT: ldr q0, [x0, #16] 227; NONEON-NOSVE-NEXT: str q0, [x1] 228; NONEON-NOSVE-NEXT: ret 229 %op = load <8 x i32>, ptr %a 230 %ret = call <4 x i32> @llvm.vector.extract.v4i32.v8i32(<8 x i32> %op, i64 4) 231 store <4 x i32> %ret, ptr %b 232 ret void 233} 234 235; i64 236 237define <1 x i64> @extract_subvector_v2i64(<2 x i64> %op) { 238; CHECK-LABEL: extract_subvector_v2i64: 239; CHECK: // %bb.0: 240; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 241; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 242; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 243; CHECK-NEXT: ret 244; 245; NONEON-NOSVE-LABEL: extract_subvector_v2i64: 246; NONEON-NOSVE: // %bb.0: 247; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 248; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 249; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 250; NONEON-NOSVE-NEXT: add sp, sp, #16 251; NONEON-NOSVE-NEXT: ret 252 %ret = call <1 x i64> @llvm.vector.extract.v1i64.v2i64(<2 x i64> %op, i64 1) 253 ret <1 x i64> %ret 254} 255 256define void @extract_subvector_v4i64(ptr %a, ptr %b) { 257; CHECK-LABEL: extract_subvector_v4i64: 258; CHECK: // %bb.0: 259; CHECK-NEXT: ldr q0, [x0, #16] 260; CHECK-NEXT: str q0, [x1] 261; CHECK-NEXT: ret 262; 263; NONEON-NOSVE-LABEL: extract_subvector_v4i64: 264; NONEON-NOSVE: // %bb.0: 265; NONEON-NOSVE-NEXT: ldr q0, [x0, #16] 266; NONEON-NOSVE-NEXT: str q0, [x1] 267; NONEON-NOSVE-NEXT: ret 268 %op = load <4 x i64>, ptr %a 269 %ret = call <2 x i64> @llvm.vector.extract.v2i64.v4i64(<4 x i64> %op, i64 2) 270 store <2 x i64> %ret, ptr %b 271 ret void 272} 273 274; f16 275 276define <2 x half> @extract_subvector_v4f16(<4 x half> %op) { 277; CHECK-LABEL: extract_subvector_v4f16: 278; CHECK: // %bb.0: 279; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 280; CHECK-NEXT: mov z0.s, z0.s[1] 281; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 282; CHECK-NEXT: ret 283; 284; NONEON-NOSVE-LABEL: extract_subvector_v4f16: 285; NONEON-NOSVE: // %bb.0: 286; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 287; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 288; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 289; NONEON-NOSVE-NEXT: str w8, [sp, #8] 290; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 291; NONEON-NOSVE-NEXT: add sp, sp, #16 292; NONEON-NOSVE-NEXT: ret 293 %ret = call <2 x half> @llvm.vector.extract.v2f16.v4f16(<4 x half> %op, i64 2) 294 ret <2 x half> %ret 295} 296 297define <4 x half> @extract_subvector_v8f16(<8 x half> %op) { 298; CHECK-LABEL: extract_subvector_v8f16: 299; CHECK: // %bb.0: 300; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 301; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 302; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 303; CHECK-NEXT: ret 304; 305; NONEON-NOSVE-LABEL: extract_subvector_v8f16: 306; NONEON-NOSVE: // %bb.0: 307; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 308; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 309; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 310; NONEON-NOSVE-NEXT: add sp, sp, #16 311; NONEON-NOSVE-NEXT: ret 312 %ret = call <4 x half> @llvm.vector.extract.v4f16.v8f16(<8 x half> %op, i64 4) 313 ret <4 x half> %ret 314} 315 316define void @extract_subvector_v16f16(ptr %a, ptr %b) { 317; CHECK-LABEL: extract_subvector_v16f16: 318; CHECK: // %bb.0: 319; CHECK-NEXT: ldr q0, [x0, #16] 320; CHECK-NEXT: str q0, [x1] 321; CHECK-NEXT: ret 322; 323; NONEON-NOSVE-LABEL: extract_subvector_v16f16: 324; NONEON-NOSVE: // %bb.0: 325; NONEON-NOSVE-NEXT: ldr q0, [x0, #16] 326; NONEON-NOSVE-NEXT: str q0, [x1] 327; NONEON-NOSVE-NEXT: ret 328 %op = load <16 x half>, ptr %a 329 %ret = call <8 x half> @llvm.vector.extract.v8f16.v16f16(<16 x half> %op, i64 8) 330 store <8 x half> %ret, ptr %b 331 ret void 332} 333 334; f32 335 336define <1 x float> @extract_subvector_v2f32(<2 x float> %op) { 337; CHECK-LABEL: extract_subvector_v2f32: 338; CHECK: // %bb.0: 339; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 340; CHECK-NEXT: mov z0.s, z0.s[1] 341; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 342; CHECK-NEXT: ret 343; 344; NONEON-NOSVE-LABEL: extract_subvector_v2f32: 345; NONEON-NOSVE: // %bb.0: 346; NONEON-NOSVE-NEXT: sub sp, sp, #16 347; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 348; NONEON-NOSVE-NEXT: str d0, [sp, #8] 349; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] 350; NONEON-NOSVE-NEXT: str w8, [sp] 351; NONEON-NOSVE-NEXT: ldr d0, [sp], #16 352; NONEON-NOSVE-NEXT: ret 353 %ret = call <1 x float> @llvm.vector.extract.v1f32.v2f32(<2 x float> %op, i64 1) 354 ret <1 x float> %ret 355} 356 357define <2 x float> @extract_subvector_v4f32(<4 x float> %op) { 358; CHECK-LABEL: extract_subvector_v4f32: 359; CHECK: // %bb.0: 360; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 361; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 362; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 363; CHECK-NEXT: ret 364; 365; NONEON-NOSVE-LABEL: extract_subvector_v4f32: 366; NONEON-NOSVE: // %bb.0: 367; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 368; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 369; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 370; NONEON-NOSVE-NEXT: add sp, sp, #16 371; NONEON-NOSVE-NEXT: ret 372 %ret = call <2 x float> @llvm.vector.extract.v2f32.v4f32(<4 x float> %op, i64 2) 373 ret <2 x float> %ret 374} 375 376define void @extract_subvector_v8f32(ptr %a, ptr %b) { 377; CHECK-LABEL: extract_subvector_v8f32: 378; CHECK: // %bb.0: 379; CHECK-NEXT: ldr q0, [x0, #16] 380; CHECK-NEXT: str q0, [x1] 381; CHECK-NEXT: ret 382; 383; NONEON-NOSVE-LABEL: extract_subvector_v8f32: 384; NONEON-NOSVE: // %bb.0: 385; NONEON-NOSVE-NEXT: ldr q0, [x0, #16] 386; NONEON-NOSVE-NEXT: str q0, [x1] 387; NONEON-NOSVE-NEXT: ret 388 %op = load <8 x float>, ptr %a 389 %ret = call <4 x float> @llvm.vector.extract.v4f32.v8f32(<8 x float> %op, i64 4) 390 store <4 x float> %ret, ptr %b 391 ret void 392} 393 394; f64 395 396define <1 x double> @extract_subvector_v2f64(<2 x double> %op) { 397; CHECK-LABEL: extract_subvector_v2f64: 398; CHECK: // %bb.0: 399; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 400; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 401; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 402; CHECK-NEXT: ret 403; 404; NONEON-NOSVE-LABEL: extract_subvector_v2f64: 405; NONEON-NOSVE: // %bb.0: 406; NONEON-NOSVE-NEXT: str q0, [sp, #-16]! 407; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 408; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 409; NONEON-NOSVE-NEXT: add sp, sp, #16 410; NONEON-NOSVE-NEXT: ret 411 %ret = call <1 x double> @llvm.vector.extract.v1f64.v2f64(<2 x double> %op, i64 1) 412 ret <1 x double> %ret 413} 414 415define void @extract_subvector_v4f64(ptr %a, ptr %b) { 416; CHECK-LABEL: extract_subvector_v4f64: 417; CHECK: // %bb.0: 418; CHECK-NEXT: ldr q0, [x0, #16] 419; CHECK-NEXT: str q0, [x1] 420; CHECK-NEXT: ret 421; 422; NONEON-NOSVE-LABEL: extract_subvector_v4f64: 423; NONEON-NOSVE: // %bb.0: 424; NONEON-NOSVE-NEXT: ldr q0, [x0, #16] 425; NONEON-NOSVE-NEXT: str q0, [x1] 426; NONEON-NOSVE-NEXT: ret 427 %op = load <4 x double>, ptr %a 428 %ret = call <2 x double> @llvm.vector.extract.v2f64.v4f64(<4 x double> %op, i64 2) 429 store <2 x double> %ret, ptr %b 430 ret void 431} 432 433declare <4 x i1> @llvm.vector.extract.v4i1.v8i1(<8 x i1>, i64) 434 435declare <4 x i8> @llvm.vector.extract.v4i8.v8i8(<8 x i8>, i64) 436declare <8 x i8> @llvm.vector.extract.v8i8.v16i8(<16 x i8>, i64) 437declare <16 x i8> @llvm.vector.extract.v16i8.v32i8(<32 x i8>, i64) 438declare <32 x i8> @llvm.vector.extract.v32i8.v64i8(<64 x i8>, i64) 439 440declare <2 x i16> @llvm.vector.extract.v2i16.v4i16(<4 x i16>, i64) 441declare <4 x i16> @llvm.vector.extract.v4i16.v8i16(<8 x i16>, i64) 442declare <8 x i16> @llvm.vector.extract.v8i16.v16i16(<16 x i16>, i64) 443declare <16 x i16> @llvm.vector.extract.v16i16.v32i16(<32 x i16>, i64) 444 445declare <1 x i32> @llvm.vector.extract.v1i32.v2i32(<2 x i32>, i64) 446declare <2 x i32> @llvm.vector.extract.v2i32.v4i32(<4 x i32>, i64) 447declare <4 x i32> @llvm.vector.extract.v4i32.v8i32(<8 x i32>, i64) 448declare <8 x i32> @llvm.vector.extract.v8i32.v16i32(<16 x i32>, i64) 449 450declare <1 x i64> @llvm.vector.extract.v1i64.v2i64(<2 x i64>, i64) 451declare <2 x i64> @llvm.vector.extract.v2i64.v4i64(<4 x i64>, i64) 452declare <4 x i64> @llvm.vector.extract.v4i64.v8i64(<8 x i64>, i64) 453 454declare <2 x half> @llvm.vector.extract.v2f16.v4f16(<4 x half>, i64) 455declare <4 x half> @llvm.vector.extract.v4f16.v8f16(<8 x half>, i64) 456declare <8 x half> @llvm.vector.extract.v8f16.v16f16(<16 x half>, i64) 457declare <16 x half> @llvm.vector.extract.v16f16.v32f16(<32 x half>, i64) 458 459declare <1 x float> @llvm.vector.extract.v1f32.v2f32(<2 x float>, i64) 460declare <2 x float> @llvm.vector.extract.v2f32.v4f32(<4 x float>, i64) 461declare <4 x float> @llvm.vector.extract.v4f32.v8f32(<8 x float>, i64) 462declare <8 x float> @llvm.vector.extract.v8f32.v16f32(<16 x float>, i64) 463 464declare <1 x double> @llvm.vector.extract.v1f64.v2f64(<2 x double>, i64) 465declare <2 x double> @llvm.vector.extract.v2f64.v4f64(<4 x double>, i64) 466declare <4 x double> @llvm.vector.extract.v4f64.v8f64(<8 x double>, i64) 467