2696 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=aarch64-none-none-eabi -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc -mtriple=aarch64-none-none-eabi -verify-machineinstrs -global-isel -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 5define <2 x i8> @dup_v2i8(i8 %a) {6; CHECK-SD-LABEL: dup_v2i8:7; CHECK-SD: // %bb.0: // %entry8; CHECK-SD-NEXT: dup v0.2s, w09; CHECK-SD-NEXT: ret10;11; CHECK-GI-LABEL: dup_v2i8:12; CHECK-GI: // %bb.0: // %entry13; CHECK-GI-NEXT: dup v0.8b, w014; CHECK-GI-NEXT: umov w8, v0.b[0]15; CHECK-GI-NEXT: umov w9, v0.b[1]16; CHECK-GI-NEXT: fmov s0, w817; CHECK-GI-NEXT: mov v0.s[1], w918; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q019; CHECK-GI-NEXT: ret20entry:21 %b = insertelement <2 x i8> poison, i8 %a, i64 022 %c = shufflevector <2 x i8> %b, <2 x i8> poison, <2 x i32> zeroinitializer23 ret <2 x i8> %c24}25 26define <2 x i8> @duplane0_v2i8(<2 x i8> %b) {27; CHECK-SD-LABEL: duplane0_v2i8:28; CHECK-SD: // %bb.0: // %entry29; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q030; CHECK-SD-NEXT: dup v0.2s, v0.s[0]31; CHECK-SD-NEXT: ret32;33; CHECK-GI-LABEL: duplane0_v2i8:34; CHECK-GI: // %bb.0: // %entry35; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q036; CHECK-GI-NEXT: mov w8, v0.s[1]37; CHECK-GI-NEXT: mov v0.b[1], w838; CHECK-GI-NEXT: dup v0.8b, v0.b[0]39; CHECK-GI-NEXT: umov w8, v0.b[0]40; CHECK-GI-NEXT: umov w9, v0.b[1]41; CHECK-GI-NEXT: fmov s0, w842; CHECK-GI-NEXT: mov v0.s[1], w943; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q044; CHECK-GI-NEXT: ret45entry:46 %c = shufflevector <2 x i8> %b, <2 x i8> poison, <2 x i32> zeroinitializer47 ret <2 x i8> %c48}49 50define <2 x i8> @loaddup_v2i8(ptr %p) {51; CHECK-SD-LABEL: loaddup_v2i8:52; CHECK-SD: // %bb.0: // %entry53; CHECK-SD-NEXT: ldr b0, [x0]54; CHECK-SD-NEXT: dup v0.2s, v0.s[0]55; CHECK-SD-NEXT: ret56;57; CHECK-GI-LABEL: loaddup_v2i8:58; CHECK-GI: // %bb.0: // %entry59; CHECK-GI-NEXT: ld1r { v0.8b }, [x0]60; CHECK-GI-NEXT: umov w8, v0.b[0]61; CHECK-GI-NEXT: umov w9, v0.b[1]62; CHECK-GI-NEXT: fmov s0, w863; CHECK-GI-NEXT: mov v0.s[1], w964; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q065; CHECK-GI-NEXT: ret66entry:67 %a = load i8, ptr %p68 %b = insertelement <2 x i8> poison, i8 %a, i64 069 %c = shufflevector <2 x i8> %b, <2 x i8> poison, <2 x i32> zeroinitializer70 ret <2 x i8> %c71}72 73define <2 x i8> @loaddup_str_v2i8(ptr %p) {74; CHECK-SD-LABEL: loaddup_str_v2i8:75; CHECK-SD: // %bb.0: // %entry76; CHECK-SD-NEXT: ldrb w8, [x0]77; CHECK-SD-NEXT: strb wzr, [x0]78; CHECK-SD-NEXT: dup v0.2s, w879; CHECK-SD-NEXT: ret80;81; CHECK-GI-LABEL: loaddup_str_v2i8:82; CHECK-GI: // %bb.0: // %entry83; CHECK-GI-NEXT: ldr b0, [x0]84; CHECK-GI-NEXT: strb wzr, [x0]85; CHECK-GI-NEXT: dup v0.8b, v0.b[0]86; CHECK-GI-NEXT: umov w8, v0.b[0]87; CHECK-GI-NEXT: umov w9, v0.b[1]88; CHECK-GI-NEXT: fmov s0, w889; CHECK-GI-NEXT: mov v0.s[1], w990; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q091; CHECK-GI-NEXT: ret92entry:93 %a = load i8, ptr %p94 %b = insertelement <2 x i8> poison, i8 %a, i64 095 store i8 0, ptr %p96 %c = shufflevector <2 x i8> %b, <2 x i8> poison, <2 x i32> zeroinitializer97 ret <2 x i8> %c98}99 100define <3 x i8> @dup_v3i8(i8 %a) {101; CHECK-SD-LABEL: dup_v3i8:102; CHECK-SD: // %bb.0: // %entry103; CHECK-SD-NEXT: mov w1, w0104; CHECK-SD-NEXT: mov w2, w0105; CHECK-SD-NEXT: ret106;107; CHECK-GI-LABEL: dup_v3i8:108; CHECK-GI: // %bb.0: // %entry109; CHECK-GI-NEXT: dup v0.8b, w0110; CHECK-GI-NEXT: umov w0, v0.b[0]111; CHECK-GI-NEXT: umov w1, v0.b[1]112; CHECK-GI-NEXT: umov w2, v0.b[2]113; CHECK-GI-NEXT: ret114entry:115 %b = insertelement <3 x i8> poison, i8 %a, i64 0116 %c = shufflevector <3 x i8> %b, <3 x i8> poison, <3 x i32> zeroinitializer117 ret <3 x i8> %c118}119 120define <3 x i8> @duplane0_v3i8(<3 x i8> %b) {121; CHECK-SD-LABEL: duplane0_v3i8:122; CHECK-SD: // %bb.0: // %entry123; CHECK-SD-NEXT: mov w1, w0124; CHECK-SD-NEXT: mov w2, w0125; CHECK-SD-NEXT: ret126;127; CHECK-GI-LABEL: duplane0_v3i8:128; CHECK-GI: // %bb.0: // %entry129; CHECK-GI-NEXT: fmov s0, w0130; CHECK-GI-NEXT: mov v0.b[1], w1131; CHECK-GI-NEXT: mov v0.b[2], w2132; CHECK-GI-NEXT: dup v0.8b, v0.b[0]133; CHECK-GI-NEXT: umov w0, v0.b[0]134; CHECK-GI-NEXT: umov w1, v0.b[1]135; CHECK-GI-NEXT: umov w2, v0.b[2]136; CHECK-GI-NEXT: ret137entry:138 %c = shufflevector <3 x i8> %b, <3 x i8> poison, <3 x i32> zeroinitializer139 ret <3 x i8> %c140}141 142define <3 x i8> @loaddup_v3i8(ptr %p) {143; CHECK-SD-LABEL: loaddup_v3i8:144; CHECK-SD: // %bb.0: // %entry145; CHECK-SD-NEXT: ldrb w0, [x0]146; CHECK-SD-NEXT: mov w1, w0147; CHECK-SD-NEXT: mov w2, w0148; CHECK-SD-NEXT: ret149;150; CHECK-GI-LABEL: loaddup_v3i8:151; CHECK-GI: // %bb.0: // %entry152; CHECK-GI-NEXT: ld1r { v0.8b }, [x0]153; CHECK-GI-NEXT: umov w0, v0.b[0]154; CHECK-GI-NEXT: umov w1, v0.b[1]155; CHECK-GI-NEXT: umov w2, v0.b[2]156; CHECK-GI-NEXT: ret157entry:158 %a = load i8, ptr %p159 %b = insertelement <3 x i8> poison, i8 %a, i64 0160 %c = shufflevector <3 x i8> %b, <3 x i8> poison, <3 x i32> zeroinitializer161 ret <3 x i8> %c162}163 164define <3 x i8> @loaddup_str_v3i8(ptr %p) {165; CHECK-SD-LABEL: loaddup_str_v3i8:166; CHECK-SD: // %bb.0: // %entry167; CHECK-SD-NEXT: mov x8, x0168; CHECK-SD-NEXT: ldrb w0, [x0]169; CHECK-SD-NEXT: strb wzr, [x8]170; CHECK-SD-NEXT: mov w1, w0171; CHECK-SD-NEXT: mov w2, w0172; CHECK-SD-NEXT: ret173;174; CHECK-GI-LABEL: loaddup_str_v3i8:175; CHECK-GI: // %bb.0: // %entry176; CHECK-GI-NEXT: ldr b0, [x0]177; CHECK-GI-NEXT: mov x8, x0178; CHECK-GI-NEXT: strb wzr, [x8]179; CHECK-GI-NEXT: dup v0.8b, v0.b[0]180; CHECK-GI-NEXT: umov w0, v0.b[0]181; CHECK-GI-NEXT: umov w1, v0.b[1]182; CHECK-GI-NEXT: umov w2, v0.b[2]183; CHECK-GI-NEXT: ret184entry:185 %a = load i8, ptr %p186 %b = insertelement <3 x i8> poison, i8 %a, i64 0187 store i8 0, ptr %p188 %c = shufflevector <3 x i8> %b, <3 x i8> poison, <3 x i32> zeroinitializer189 ret <3 x i8> %c190}191 192define <4 x i8> @dup_v4i8(i8 %a) {193; CHECK-SD-LABEL: dup_v4i8:194; CHECK-SD: // %bb.0: // %entry195; CHECK-SD-NEXT: dup v0.4h, w0196; CHECK-SD-NEXT: ret197;198; CHECK-GI-LABEL: dup_v4i8:199; CHECK-GI: // %bb.0: // %entry200; CHECK-GI-NEXT: dup v0.8b, w0201; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0202; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0203; CHECK-GI-NEXT: ret204entry:205 %b = insertelement <4 x i8> poison, i8 %a, i64 0206 %c = shufflevector <4 x i8> %b, <4 x i8> poison, <4 x i32> zeroinitializer207 ret <4 x i8> %c208}209 210define <4 x i8> @duplane0_v4i8(<4 x i8> %b) {211; CHECK-SD-LABEL: duplane0_v4i8:212; CHECK-SD: // %bb.0: // %entry213; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0214; CHECK-SD-NEXT: dup v0.4h, v0.h[0]215; CHECK-SD-NEXT: ret216;217; CHECK-GI-LABEL: duplane0_v4i8:218; CHECK-GI: // %bb.0: // %entry219; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b220; CHECK-GI-NEXT: dup v0.8b, v0.b[0]221; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0222; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0223; CHECK-GI-NEXT: ret224entry:225 %c = shufflevector <4 x i8> %b, <4 x i8> poison, <4 x i32> zeroinitializer226 ret <4 x i8> %c227}228 229define <4 x i8> @loaddup_v4i8(ptr %p) {230; CHECK-SD-LABEL: loaddup_v4i8:231; CHECK-SD: // %bb.0: // %entry232; CHECK-SD-NEXT: ldr b0, [x0]233; CHECK-SD-NEXT: dup v0.4h, v0.h[0]234; CHECK-SD-NEXT: ret235;236; CHECK-GI-LABEL: loaddup_v4i8:237; CHECK-GI: // %bb.0: // %entry238; CHECK-GI-NEXT: ld1r { v0.8b }, [x0]239; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0240; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0241; CHECK-GI-NEXT: ret242entry:243 %a = load i8, ptr %p244 %b = insertelement <4 x i8> poison, i8 %a, i64 0245 %c = shufflevector <4 x i8> %b, <4 x i8> poison, <4 x i32> zeroinitializer246 ret <4 x i8> %c247}248 249define <4 x i8> @loaddup_str_v4i8(ptr %p) {250; CHECK-SD-LABEL: loaddup_str_v4i8:251; CHECK-SD: // %bb.0: // %entry252; CHECK-SD-NEXT: ldrb w8, [x0]253; CHECK-SD-NEXT: strb wzr, [x0]254; CHECK-SD-NEXT: dup v0.4h, w8255; CHECK-SD-NEXT: ret256;257; CHECK-GI-LABEL: loaddup_str_v4i8:258; CHECK-GI: // %bb.0: // %entry259; CHECK-GI-NEXT: ldr b0, [x0]260; CHECK-GI-NEXT: strb wzr, [x0]261; CHECK-GI-NEXT: dup v0.8b, v0.b[0]262; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0263; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0264; CHECK-GI-NEXT: ret265entry:266 %a = load i8, ptr %p267 %b = insertelement <4 x i8> poison, i8 %a, i64 0268 store i8 0, ptr %p269 %c = shufflevector <4 x i8> %b, <4 x i8> poison, <4 x i32> zeroinitializer270 ret <4 x i8> %c271}272 273define <8 x i8> @dup_v8i8(i8 %a) {274; CHECK-LABEL: dup_v8i8:275; CHECK: // %bb.0: // %entry276; CHECK-NEXT: dup v0.8b, w0277; CHECK-NEXT: ret278entry:279 %b = insertelement <8 x i8> poison, i8 %a, i64 0280 %c = shufflevector <8 x i8> %b, <8 x i8> poison, <8 x i32> zeroinitializer281 ret <8 x i8> %c282}283 284define <8 x i8> @duplane0_v8i8(<8 x i8> %b) {285; CHECK-LABEL: duplane0_v8i8:286; CHECK: // %bb.0: // %entry287; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0288; CHECK-NEXT: dup v0.8b, v0.b[0]289; CHECK-NEXT: ret290entry:291 %c = shufflevector <8 x i8> %b, <8 x i8> poison, <8 x i32> zeroinitializer292 ret <8 x i8> %c293}294 295define <8 x i8> @loaddup_v8i8(ptr %p) {296; CHECK-LABEL: loaddup_v8i8:297; CHECK: // %bb.0: // %entry298; CHECK-NEXT: ld1r { v0.8b }, [x0]299; CHECK-NEXT: ret300entry:301 %a = load i8, ptr %p302 %b = insertelement <8 x i8> poison, i8 %a, i64 0303 %c = shufflevector <8 x i8> %b, <8 x i8> poison, <8 x i32> zeroinitializer304 ret <8 x i8> %c305}306 307define <8 x i8> @loaddup_str_v8i8(ptr %p) {308; CHECK-SD-LABEL: loaddup_str_v8i8:309; CHECK-SD: // %bb.0: // %entry310; CHECK-SD-NEXT: ld1r { v0.8b }, [x0]311; CHECK-SD-NEXT: strb wzr, [x0]312; CHECK-SD-NEXT: ret313;314; CHECK-GI-LABEL: loaddup_str_v8i8:315; CHECK-GI: // %bb.0: // %entry316; CHECK-GI-NEXT: ldr b0, [x0]317; CHECK-GI-NEXT: strb wzr, [x0]318; CHECK-GI-NEXT: dup v0.8b, v0.b[0]319; CHECK-GI-NEXT: ret320entry:321 %a = load i8, ptr %p322 %b = insertelement <8 x i8> poison, i8 %a, i64 0323 store i8 0, ptr %p324 %c = shufflevector <8 x i8> %b, <8 x i8> poison, <8 x i32> zeroinitializer325 ret <8 x i8> %c326}327 328define <16 x i8> @dup_v16i8(i8 %a) {329; CHECK-LABEL: dup_v16i8:330; CHECK: // %bb.0: // %entry331; CHECK-NEXT: dup v0.16b, w0332; CHECK-NEXT: ret333entry:334 %b = insertelement <16 x i8> poison, i8 %a, i64 0335 %c = shufflevector <16 x i8> %b, <16 x i8> poison, <16 x i32> zeroinitializer336 ret <16 x i8> %c337}338 339define <16 x i8> @duplane0_v16i8(<16 x i8> %b) {340; CHECK-LABEL: duplane0_v16i8:341; CHECK: // %bb.0: // %entry342; CHECK-NEXT: dup v0.16b, v0.b[0]343; CHECK-NEXT: ret344entry:345 %c = shufflevector <16 x i8> %b, <16 x i8> poison, <16 x i32> zeroinitializer346 ret <16 x i8> %c347}348 349define <16 x i8> @loaddup_v16i8(ptr %p) {350; CHECK-LABEL: loaddup_v16i8:351; CHECK: // %bb.0: // %entry352; CHECK-NEXT: ld1r { v0.16b }, [x0]353; CHECK-NEXT: ret354entry:355 %a = load i8, ptr %p356 %b = insertelement <16 x i8> poison, i8 %a, i64 0357 %c = shufflevector <16 x i8> %b, <16 x i8> poison, <16 x i32> zeroinitializer358 ret <16 x i8> %c359}360 361define <16 x i8> @loaddup_str_v16i8(ptr %p) {362; CHECK-SD-LABEL: loaddup_str_v16i8:363; CHECK-SD: // %bb.0: // %entry364; CHECK-SD-NEXT: ld1r { v0.16b }, [x0]365; CHECK-SD-NEXT: strb wzr, [x0]366; CHECK-SD-NEXT: ret367;368; CHECK-GI-LABEL: loaddup_str_v16i8:369; CHECK-GI: // %bb.0: // %entry370; CHECK-GI-NEXT: ldr b0, [x0]371; CHECK-GI-NEXT: strb wzr, [x0]372; CHECK-GI-NEXT: dup v0.16b, v0.b[0]373; CHECK-GI-NEXT: ret374entry:375 %a = load i8, ptr %p376 %b = insertelement <16 x i8> poison, i8 %a, i64 0377 store i8 0, ptr %p378 %c = shufflevector <16 x i8> %b, <16 x i8> poison, <16 x i32> zeroinitializer379 ret <16 x i8> %c380}381 382define <32 x i8> @dup_v32i8(i8 %a) {383; CHECK-LABEL: dup_v32i8:384; CHECK: // %bb.0: // %entry385; CHECK-NEXT: dup v0.16b, w0386; CHECK-NEXT: mov v1.16b, v0.16b387; CHECK-NEXT: ret388entry:389 %b = insertelement <32 x i8> poison, i8 %a, i64 0390 %c = shufflevector <32 x i8> %b, <32 x i8> poison, <32 x i32> zeroinitializer391 ret <32 x i8> %c392}393 394define <32 x i8> @duplane0_v32i8(<32 x i8> %b) {395; CHECK-LABEL: duplane0_v32i8:396; CHECK: // %bb.0: // %entry397; CHECK-NEXT: dup v0.16b, v0.b[0]398; CHECK-NEXT: mov v1.16b, v0.16b399; CHECK-NEXT: ret400entry:401 %c = shufflevector <32 x i8> %b, <32 x i8> poison, <32 x i32> zeroinitializer402 ret <32 x i8> %c403}404 405define <32 x i8> @loaddup_v32i8(ptr %p) {406; CHECK-SD-LABEL: loaddup_v32i8:407; CHECK-SD: // %bb.0: // %entry408; CHECK-SD-NEXT: ld1r { v0.16b }, [x0]409; CHECK-SD-NEXT: mov v1.16b, v0.16b410; CHECK-SD-NEXT: ret411;412; CHECK-GI-LABEL: loaddup_v32i8:413; CHECK-GI: // %bb.0: // %entry414; CHECK-GI-NEXT: ld1r { v0.16b }, [x0]415; CHECK-GI-NEXT: ld1r { v1.16b }, [x0]416; CHECK-GI-NEXT: ret417entry:418 %a = load i8, ptr %p419 %b = insertelement <32 x i8> poison, i8 %a, i64 0420 %c = shufflevector <32 x i8> %b, <32 x i8> poison, <32 x i32> zeroinitializer421 ret <32 x i8> %c422}423 424define <32 x i8> @loaddup_str_v32i8(ptr %p) {425; CHECK-SD-LABEL: loaddup_str_v32i8:426; CHECK-SD: // %bb.0: // %entry427; CHECK-SD-NEXT: ld1r { v0.16b }, [x0]428; CHECK-SD-NEXT: strb wzr, [x0]429; CHECK-SD-NEXT: mov v1.16b, v0.16b430; CHECK-SD-NEXT: ret431;432; CHECK-GI-LABEL: loaddup_str_v32i8:433; CHECK-GI: // %bb.0: // %entry434; CHECK-GI-NEXT: ldr b1, [x0]435; CHECK-GI-NEXT: strb wzr, [x0]436; CHECK-GI-NEXT: dup v0.16b, v1.b[0]437; CHECK-GI-NEXT: dup v1.16b, v1.b[0]438; CHECK-GI-NEXT: ret439entry:440 %a = load i8, ptr %p441 %b = insertelement <32 x i8> poison, i8 %a, i64 0442 store i8 0, ptr %p443 %c = shufflevector <32 x i8> %b, <32 x i8> poison, <32 x i32> zeroinitializer444 ret <32 x i8> %c445}446 447define <2 x i16> @dup_v2i16(i16 %a) {448; CHECK-SD-LABEL: dup_v2i16:449; CHECK-SD: // %bb.0: // %entry450; CHECK-SD-NEXT: dup v0.2s, w0451; CHECK-SD-NEXT: ret452;453; CHECK-GI-LABEL: dup_v2i16:454; CHECK-GI: // %bb.0: // %entry455; CHECK-GI-NEXT: dup v0.4h, w0456; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0457; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0458; CHECK-GI-NEXT: ret459entry:460 %b = insertelement <2 x i16> poison, i16 %a, i64 0461 %c = shufflevector <2 x i16> %b, <2 x i16> poison, <2 x i32> zeroinitializer462 ret <2 x i16> %c463}464 465define <2 x i16> @duplane0_v2i16(<2 x i16> %b) {466; CHECK-SD-LABEL: duplane0_v2i16:467; CHECK-SD: // %bb.0: // %entry468; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0469; CHECK-SD-NEXT: dup v0.2s, v0.s[0]470; CHECK-SD-NEXT: ret471;472; CHECK-GI-LABEL: duplane0_v2i16:473; CHECK-GI: // %bb.0: // %entry474; CHECK-GI-NEXT: uzp1 v0.4h, v0.4h, v0.4h475; CHECK-GI-NEXT: dup v0.4h, v0.h[0]476; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0477; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0478; CHECK-GI-NEXT: ret479entry:480 %c = shufflevector <2 x i16> %b, <2 x i16> poison, <2 x i32> zeroinitializer481 ret <2 x i16> %c482}483 484define <2 x i16> @loaddup_v2i16(ptr %p) {485; CHECK-SD-LABEL: loaddup_v2i16:486; CHECK-SD: // %bb.0: // %entry487; CHECK-SD-NEXT: ldr h0, [x0]488; CHECK-SD-NEXT: dup v0.2s, v0.s[0]489; CHECK-SD-NEXT: ret490;491; CHECK-GI-LABEL: loaddup_v2i16:492; CHECK-GI: // %bb.0: // %entry493; CHECK-GI-NEXT: ld1r { v0.4h }, [x0]494; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0495; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0496; CHECK-GI-NEXT: ret497entry:498 %a = load i16, ptr %p499 %b = insertelement <2 x i16> poison, i16 %a, i64 0500 %c = shufflevector <2 x i16> %b, <2 x i16> poison, <2 x i32> zeroinitializer501 ret <2 x i16> %c502}503 504define <2 x i16> @loaddup_str_v2i16(ptr %p) {505; CHECK-SD-LABEL: loaddup_str_v2i16:506; CHECK-SD: // %bb.0: // %entry507; CHECK-SD-NEXT: ldrh w8, [x0]508; CHECK-SD-NEXT: strh wzr, [x0]509; CHECK-SD-NEXT: dup v0.2s, w8510; CHECK-SD-NEXT: ret511;512; CHECK-GI-LABEL: loaddup_str_v2i16:513; CHECK-GI: // %bb.0: // %entry514; CHECK-GI-NEXT: ldr h0, [x0]515; CHECK-GI-NEXT: strh wzr, [x0]516; CHECK-GI-NEXT: dup v0.4h, v0.h[0]517; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0518; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0519; CHECK-GI-NEXT: ret520entry:521 %a = load i16, ptr %p522 %b = insertelement <2 x i16> poison, i16 %a, i64 0523 store i16 0, ptr %p524 %c = shufflevector <2 x i16> %b, <2 x i16> poison, <2 x i32> zeroinitializer525 ret <2 x i16> %c526}527 528define <3 x i16> @dup_v3i16(i16 %a) {529; CHECK-LABEL: dup_v3i16:530; CHECK: // %bb.0: // %entry531; CHECK-NEXT: dup v0.4h, w0532; CHECK-NEXT: ret533entry:534 %b = insertelement <3 x i16> poison, i16 %a, i64 0535 %c = shufflevector <3 x i16> %b, <3 x i16> poison, <3 x i32> zeroinitializer536 ret <3 x i16> %c537}538 539define <3 x i16> @duplane0_v3i16(<3 x i16> %b) {540; CHECK-LABEL: duplane0_v3i16:541; CHECK: // %bb.0: // %entry542; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0543; CHECK-NEXT: dup v0.4h, v0.h[0]544; CHECK-NEXT: ret545entry:546 %c = shufflevector <3 x i16> %b, <3 x i16> poison, <3 x i32> zeroinitializer547 ret <3 x i16> %c548}549 550define <3 x i16> @loaddup_v3i16(ptr %p) {551; CHECK-LABEL: loaddup_v3i16:552; CHECK: // %bb.0: // %entry553; CHECK-NEXT: ld1r { v0.4h }, [x0]554; CHECK-NEXT: ret555entry:556 %a = load i16, ptr %p557 %b = insertelement <3 x i16> poison, i16 %a, i64 0558 %c = shufflevector <3 x i16> %b, <3 x i16> poison, <3 x i32> zeroinitializer559 ret <3 x i16> %c560}561 562define <3 x i16> @loaddup_str_v3i16(ptr %p) {563; CHECK-SD-LABEL: loaddup_str_v3i16:564; CHECK-SD: // %bb.0: // %entry565; CHECK-SD-NEXT: ld1r { v0.4h }, [x0]566; CHECK-SD-NEXT: strh wzr, [x0]567; CHECK-SD-NEXT: ret568;569; CHECK-GI-LABEL: loaddup_str_v3i16:570; CHECK-GI: // %bb.0: // %entry571; CHECK-GI-NEXT: ldr h0, [x0]572; CHECK-GI-NEXT: strh wzr, [x0]573; CHECK-GI-NEXT: dup v0.4h, v0.h[0]574; CHECK-GI-NEXT: ret575entry:576 %a = load i16, ptr %p577 %b = insertelement <3 x i16> poison, i16 %a, i64 0578 store i16 0, ptr %p579 %c = shufflevector <3 x i16> %b, <3 x i16> poison, <3 x i32> zeroinitializer580 ret <3 x i16> %c581}582 583define <4 x i16> @dup_v4i16(i16 %a) {584; CHECK-LABEL: dup_v4i16:585; CHECK: // %bb.0: // %entry586; CHECK-NEXT: dup v0.4h, w0587; CHECK-NEXT: ret588entry:589 %b = insertelement <4 x i16> poison, i16 %a, i64 0590 %c = shufflevector <4 x i16> %b, <4 x i16> poison, <4 x i32> zeroinitializer591 ret <4 x i16> %c592}593 594define <4 x i16> @duplane0_v4i16(<4 x i16> %b) {595; CHECK-LABEL: duplane0_v4i16:596; CHECK: // %bb.0: // %entry597; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0598; CHECK-NEXT: dup v0.4h, v0.h[0]599; CHECK-NEXT: ret600entry:601 %c = shufflevector <4 x i16> %b, <4 x i16> poison, <4 x i32> zeroinitializer602 ret <4 x i16> %c603}604 605define <4 x i16> @loaddup_v4i16(ptr %p) {606; CHECK-LABEL: loaddup_v4i16:607; CHECK: // %bb.0: // %entry608; CHECK-NEXT: ld1r { v0.4h }, [x0]609; CHECK-NEXT: ret610entry:611 %a = load i16, ptr %p612 %b = insertelement <4 x i16> poison, i16 %a, i64 0613 %c = shufflevector <4 x i16> %b, <4 x i16> poison, <4 x i32> zeroinitializer614 ret <4 x i16> %c615}616 617define <4 x i16> @loaddup_str_v4i16(ptr %p) {618; CHECK-SD-LABEL: loaddup_str_v4i16:619; CHECK-SD: // %bb.0: // %entry620; CHECK-SD-NEXT: ld1r { v0.4h }, [x0]621; CHECK-SD-NEXT: strh wzr, [x0]622; CHECK-SD-NEXT: ret623;624; CHECK-GI-LABEL: loaddup_str_v4i16:625; CHECK-GI: // %bb.0: // %entry626; CHECK-GI-NEXT: ldr h0, [x0]627; CHECK-GI-NEXT: strh wzr, [x0]628; CHECK-GI-NEXT: dup v0.4h, v0.h[0]629; CHECK-GI-NEXT: ret630entry:631 %a = load i16, ptr %p632 %b = insertelement <4 x i16> poison, i16 %a, i64 0633 store i16 0, ptr %p634 %c = shufflevector <4 x i16> %b, <4 x i16> poison, <4 x i32> zeroinitializer635 ret <4 x i16> %c636}637 638define <8 x i16> @dup_v8i16(i16 %a) {639; CHECK-LABEL: dup_v8i16:640; CHECK: // %bb.0: // %entry641; CHECK-NEXT: dup v0.8h, w0642; CHECK-NEXT: ret643entry:644 %b = insertelement <8 x i16> poison, i16 %a, i64 0645 %c = shufflevector <8 x i16> %b, <8 x i16> poison, <8 x i32> zeroinitializer646 ret <8 x i16> %c647}648 649define <8 x i16> @duplane0_v8i16(<8 x i16> %b) {650; CHECK-LABEL: duplane0_v8i16:651; CHECK: // %bb.0: // %entry652; CHECK-NEXT: dup v0.8h, v0.h[0]653; CHECK-NEXT: ret654entry:655 %c = shufflevector <8 x i16> %b, <8 x i16> poison, <8 x i32> zeroinitializer656 ret <8 x i16> %c657}658 659define <8 x i16> @loaddup_v8i16(ptr %p) {660; CHECK-LABEL: loaddup_v8i16:661; CHECK: // %bb.0: // %entry662; CHECK-NEXT: ld1r { v0.8h }, [x0]663; CHECK-NEXT: ret664entry:665 %a = load i16, ptr %p666 %b = insertelement <8 x i16> poison, i16 %a, i64 0667 %c = shufflevector <8 x i16> %b, <8 x i16> poison, <8 x i32> zeroinitializer668 ret <8 x i16> %c669}670 671define <8 x i16> @loaddup_str_v8i16(ptr %p) {672; CHECK-SD-LABEL: loaddup_str_v8i16:673; CHECK-SD: // %bb.0: // %entry674; CHECK-SD-NEXT: ld1r { v0.8h }, [x0]675; CHECK-SD-NEXT: strh wzr, [x0]676; CHECK-SD-NEXT: ret677;678; CHECK-GI-LABEL: loaddup_str_v8i16:679; CHECK-GI: // %bb.0: // %entry680; CHECK-GI-NEXT: ldr h0, [x0]681; CHECK-GI-NEXT: strh wzr, [x0]682; CHECK-GI-NEXT: dup v0.8h, v0.h[0]683; CHECK-GI-NEXT: ret684entry:685 %a = load i16, ptr %p686 %b = insertelement <8 x i16> poison, i16 %a, i64 0687 store i16 0, ptr %p688 %c = shufflevector <8 x i16> %b, <8 x i16> poison, <8 x i32> zeroinitializer689 ret <8 x i16> %c690}691 692define <16 x i16> @dup_v16i16(i16 %a) {693; CHECK-LABEL: dup_v16i16:694; CHECK: // %bb.0: // %entry695; CHECK-NEXT: dup v0.8h, w0696; CHECK-NEXT: mov v1.16b, v0.16b697; CHECK-NEXT: ret698entry:699 %b = insertelement <16 x i16> poison, i16 %a, i64 0700 %c = shufflevector <16 x i16> %b, <16 x i16> poison, <16 x i32> zeroinitializer701 ret <16 x i16> %c702}703 704define <16 x i16> @duplane0_v16i16(<16 x i16> %b) {705; CHECK-LABEL: duplane0_v16i16:706; CHECK: // %bb.0: // %entry707; CHECK-NEXT: dup v0.8h, v0.h[0]708; CHECK-NEXT: mov v1.16b, v0.16b709; CHECK-NEXT: ret710entry:711 %c = shufflevector <16 x i16> %b, <16 x i16> poison, <16 x i32> zeroinitializer712 ret <16 x i16> %c713}714 715define <16 x i16> @loaddup_v16i16(ptr %p) {716; CHECK-SD-LABEL: loaddup_v16i16:717; CHECK-SD: // %bb.0: // %entry718; CHECK-SD-NEXT: ld1r { v0.8h }, [x0]719; CHECK-SD-NEXT: mov v1.16b, v0.16b720; CHECK-SD-NEXT: ret721;722; CHECK-GI-LABEL: loaddup_v16i16:723; CHECK-GI: // %bb.0: // %entry724; CHECK-GI-NEXT: ld1r { v0.8h }, [x0]725; CHECK-GI-NEXT: ld1r { v1.8h }, [x0]726; CHECK-GI-NEXT: ret727entry:728 %a = load i16, ptr %p729 %b = insertelement <16 x i16> poison, i16 %a, i64 0730 %c = shufflevector <16 x i16> %b, <16 x i16> poison, <16 x i32> zeroinitializer731 ret <16 x i16> %c732}733 734define <16 x i16> @loaddup_str_v16i16(ptr %p) {735; CHECK-SD-LABEL: loaddup_str_v16i16:736; CHECK-SD: // %bb.0: // %entry737; CHECK-SD-NEXT: ld1r { v0.8h }, [x0]738; CHECK-SD-NEXT: strh wzr, [x0]739; CHECK-SD-NEXT: mov v1.16b, v0.16b740; CHECK-SD-NEXT: ret741;742; CHECK-GI-LABEL: loaddup_str_v16i16:743; CHECK-GI: // %bb.0: // %entry744; CHECK-GI-NEXT: ldr h1, [x0]745; CHECK-GI-NEXT: strh wzr, [x0]746; CHECK-GI-NEXT: dup v0.8h, v1.h[0]747; CHECK-GI-NEXT: dup v1.8h, v1.h[0]748; CHECK-GI-NEXT: ret749entry:750 %a = load i16, ptr %p751 %b = insertelement <16 x i16> poison, i16 %a, i64 0752 store i16 0, ptr %p753 %c = shufflevector <16 x i16> %b, <16 x i16> poison, <16 x i32> zeroinitializer754 ret <16 x i16> %c755}756 757define <2 x i32> @dup_v2i32(i32 %a) {758; CHECK-LABEL: dup_v2i32:759; CHECK: // %bb.0: // %entry760; CHECK-NEXT: dup v0.2s, w0761; CHECK-NEXT: ret762entry:763 %b = insertelement <2 x i32> poison, i32 %a, i64 0764 %c = shufflevector <2 x i32> %b, <2 x i32> poison, <2 x i32> zeroinitializer765 ret <2 x i32> %c766}767 768define <2 x i32> @duplane0_v2i32(<2 x i32> %b) {769; CHECK-LABEL: duplane0_v2i32:770; CHECK: // %bb.0: // %entry771; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0772; CHECK-NEXT: dup v0.2s, v0.s[0]773; CHECK-NEXT: ret774entry:775 %c = shufflevector <2 x i32> %b, <2 x i32> poison, <2 x i32> zeroinitializer776 ret <2 x i32> %c777}778 779define <2 x i32> @loaddup_v2i32(ptr %p) {780; CHECK-LABEL: loaddup_v2i32:781; CHECK: // %bb.0: // %entry782; CHECK-NEXT: ld1r { v0.2s }, [x0]783; CHECK-NEXT: ret784entry:785 %a = load i32, ptr %p786 %b = insertelement <2 x i32> poison, i32 %a, i64 0787 %c = shufflevector <2 x i32> %b, <2 x i32> poison, <2 x i32> zeroinitializer788 ret <2 x i32> %c789}790 791define <2 x i32> @loaddup_str_v2i32(ptr %p) {792; CHECK-SD-LABEL: loaddup_str_v2i32:793; CHECK-SD: // %bb.0: // %entry794; CHECK-SD-NEXT: ld1r { v0.2s }, [x0]795; CHECK-SD-NEXT: str wzr, [x0]796; CHECK-SD-NEXT: ret797;798; CHECK-GI-LABEL: loaddup_str_v2i32:799; CHECK-GI: // %bb.0: // %entry800; CHECK-GI-NEXT: ldr s0, [x0]801; CHECK-GI-NEXT: str wzr, [x0]802; CHECK-GI-NEXT: dup v0.2s, v0.s[0]803; CHECK-GI-NEXT: ret804entry:805 %a = load i32, ptr %p806 %b = insertelement <2 x i32> poison, i32 %a, i64 0807 store i32 0, ptr %p808 %c = shufflevector <2 x i32> %b, <2 x i32> poison, <2 x i32> zeroinitializer809 ret <2 x i32> %c810}811 812define <3 x i32> @dup_v3i32(i32 %a) {813; CHECK-LABEL: dup_v3i32:814; CHECK: // %bb.0: // %entry815; CHECK-NEXT: dup v0.4s, w0816; CHECK-NEXT: ret817entry:818 %b = insertelement <3 x i32> poison, i32 %a, i64 0819 %c = shufflevector <3 x i32> %b, <3 x i32> poison, <3 x i32> zeroinitializer820 ret <3 x i32> %c821}822 823define <3 x i32> @duplane0_v3i32(<3 x i32> %b) {824; CHECK-LABEL: duplane0_v3i32:825; CHECK: // %bb.0: // %entry826; CHECK-NEXT: dup v0.4s, v0.s[0]827; CHECK-NEXT: ret828entry:829 %c = shufflevector <3 x i32> %b, <3 x i32> poison, <3 x i32> zeroinitializer830 ret <3 x i32> %c831}832 833define <3 x i32> @loaddup_v3i32(ptr %p) {834; CHECK-LABEL: loaddup_v3i32:835; CHECK: // %bb.0: // %entry836; CHECK-NEXT: ld1r { v0.4s }, [x0]837; CHECK-NEXT: ret838entry:839 %a = load i32, ptr %p840 %b = insertelement <3 x i32> poison, i32 %a, i64 0841 %c = shufflevector <3 x i32> %b, <3 x i32> poison, <3 x i32> zeroinitializer842 ret <3 x i32> %c843}844 845define <3 x i32> @loaddup_str_v3i32(ptr %p) {846; CHECK-SD-LABEL: loaddup_str_v3i32:847; CHECK-SD: // %bb.0: // %entry848; CHECK-SD-NEXT: ld1r { v0.4s }, [x0]849; CHECK-SD-NEXT: str wzr, [x0]850; CHECK-SD-NEXT: ret851;852; CHECK-GI-LABEL: loaddup_str_v3i32:853; CHECK-GI: // %bb.0: // %entry854; CHECK-GI-NEXT: ldr s0, [x0]855; CHECK-GI-NEXT: str wzr, [x0]856; CHECK-GI-NEXT: dup v0.4s, v0.s[0]857; CHECK-GI-NEXT: ret858entry:859 %a = load i32, ptr %p860 %b = insertelement <3 x i32> poison, i32 %a, i64 0861 store i32 0, ptr %p862 %c = shufflevector <3 x i32> %b, <3 x i32> poison, <3 x i32> zeroinitializer863 ret <3 x i32> %c864}865 866define <4 x i32> @dup_v4i32(i32 %a) {867; CHECK-LABEL: dup_v4i32:868; CHECK: // %bb.0: // %entry869; CHECK-NEXT: dup v0.4s, w0870; CHECK-NEXT: ret871entry:872 %b = insertelement <4 x i32> poison, i32 %a, i64 0873 %c = shufflevector <4 x i32> %b, <4 x i32> poison, <4 x i32> zeroinitializer874 ret <4 x i32> %c875}876 877define <4 x i32> @duplane0_v4i32(<4 x i32> %b) {878; CHECK-LABEL: duplane0_v4i32:879; CHECK: // %bb.0: // %entry880; CHECK-NEXT: dup v0.4s, v0.s[0]881; CHECK-NEXT: ret882entry:883 %c = shufflevector <4 x i32> %b, <4 x i32> poison, <4 x i32> zeroinitializer884 ret <4 x i32> %c885}886 887define <4 x i32> @loaddup_v4i32(ptr %p) {888; CHECK-LABEL: loaddup_v4i32:889; CHECK: // %bb.0: // %entry890; CHECK-NEXT: ld1r { v0.4s }, [x0]891; CHECK-NEXT: ret892entry:893 %a = load i32, ptr %p894 %b = insertelement <4 x i32> poison, i32 %a, i64 0895 %c = shufflevector <4 x i32> %b, <4 x i32> poison, <4 x i32> zeroinitializer896 ret <4 x i32> %c897}898 899define <4 x i32> @loaddup_str_v4i32(ptr %p) {900; CHECK-SD-LABEL: loaddup_str_v4i32:901; CHECK-SD: // %bb.0: // %entry902; CHECK-SD-NEXT: ld1r { v0.4s }, [x0]903; CHECK-SD-NEXT: str wzr, [x0]904; CHECK-SD-NEXT: ret905;906; CHECK-GI-LABEL: loaddup_str_v4i32:907; CHECK-GI: // %bb.0: // %entry908; CHECK-GI-NEXT: ldr s0, [x0]909; CHECK-GI-NEXT: str wzr, [x0]910; CHECK-GI-NEXT: dup v0.4s, v0.s[0]911; CHECK-GI-NEXT: ret912entry:913 %a = load i32, ptr %p914 %b = insertelement <4 x i32> poison, i32 %a, i64 0915 store i32 0, ptr %p916 %c = shufflevector <4 x i32> %b, <4 x i32> poison, <4 x i32> zeroinitializer917 ret <4 x i32> %c918}919 920define <8 x i32> @dup_v8i32(i32 %a) {921; CHECK-LABEL: dup_v8i32:922; CHECK: // %bb.0: // %entry923; CHECK-NEXT: dup v0.4s, w0924; CHECK-NEXT: mov v1.16b, v0.16b925; CHECK-NEXT: ret926entry:927 %b = insertelement <8 x i32> poison, i32 %a, i64 0928 %c = shufflevector <8 x i32> %b, <8 x i32> poison, <8 x i32> zeroinitializer929 ret <8 x i32> %c930}931 932define <8 x i32> @duplane0_v8i32(<8 x i32> %b) {933; CHECK-LABEL: duplane0_v8i32:934; CHECK: // %bb.0: // %entry935; CHECK-NEXT: dup v0.4s, v0.s[0]936; CHECK-NEXT: mov v1.16b, v0.16b937; CHECK-NEXT: ret938entry:939 %c = shufflevector <8 x i32> %b, <8 x i32> poison, <8 x i32> zeroinitializer940 ret <8 x i32> %c941}942 943define <8 x i32> @loaddup_v8i32(ptr %p) {944; CHECK-SD-LABEL: loaddup_v8i32:945; CHECK-SD: // %bb.0: // %entry946; CHECK-SD-NEXT: ld1r { v0.4s }, [x0]947; CHECK-SD-NEXT: mov v1.16b, v0.16b948; CHECK-SD-NEXT: ret949;950; CHECK-GI-LABEL: loaddup_v8i32:951; CHECK-GI: // %bb.0: // %entry952; CHECK-GI-NEXT: ld1r { v0.4s }, [x0]953; CHECK-GI-NEXT: ld1r { v1.4s }, [x0]954; CHECK-GI-NEXT: ret955entry:956 %a = load i32, ptr %p957 %b = insertelement <8 x i32> poison, i32 %a, i64 0958 %c = shufflevector <8 x i32> %b, <8 x i32> poison, <8 x i32> zeroinitializer959 ret <8 x i32> %c960}961 962define <8 x i32> @loaddup_str_v8i32(ptr %p) {963; CHECK-SD-LABEL: loaddup_str_v8i32:964; CHECK-SD: // %bb.0: // %entry965; CHECK-SD-NEXT: ld1r { v0.4s }, [x0]966; CHECK-SD-NEXT: str wzr, [x0]967; CHECK-SD-NEXT: mov v1.16b, v0.16b968; CHECK-SD-NEXT: ret969;970; CHECK-GI-LABEL: loaddup_str_v8i32:971; CHECK-GI: // %bb.0: // %entry972; CHECK-GI-NEXT: ldr s1, [x0]973; CHECK-GI-NEXT: str wzr, [x0]974; CHECK-GI-NEXT: dup v0.4s, v1.s[0]975; CHECK-GI-NEXT: dup v1.4s, v1.s[0]976; CHECK-GI-NEXT: ret977entry:978 %a = load i32, ptr %p979 %b = insertelement <8 x i32> poison, i32 %a, i64 0980 store i32 0, ptr %p981 %c = shufflevector <8 x i32> %b, <8 x i32> poison, <8 x i32> zeroinitializer982 ret <8 x i32> %c983}984 985define <2 x i64> @dup_v2i64(i64 %a) {986; CHECK-LABEL: dup_v2i64:987; CHECK: // %bb.0: // %entry988; CHECK-NEXT: dup v0.2d, x0989; CHECK-NEXT: ret990entry:991 %b = insertelement <2 x i64> poison, i64 %a, i64 0992 %c = shufflevector <2 x i64> %b, <2 x i64> poison, <2 x i32> zeroinitializer993 ret <2 x i64> %c994}995 996define <2 x i64> @duplane0_v2i64(<2 x i64> %b) {997; CHECK-LABEL: duplane0_v2i64:998; CHECK: // %bb.0: // %entry999; CHECK-NEXT: dup v0.2d, v0.d[0]1000; CHECK-NEXT: ret1001entry:1002 %c = shufflevector <2 x i64> %b, <2 x i64> poison, <2 x i32> zeroinitializer1003 ret <2 x i64> %c1004}1005 1006define <2 x i64> @loaddup_v2i64(ptr %p) {1007; CHECK-LABEL: loaddup_v2i64:1008; CHECK: // %bb.0: // %entry1009; CHECK-NEXT: ld1r { v0.2d }, [x0]1010; CHECK-NEXT: ret1011entry:1012 %a = load i64, ptr %p1013 %b = insertelement <2 x i64> poison, i64 %a, i64 01014 %c = shufflevector <2 x i64> %b, <2 x i64> poison, <2 x i32> zeroinitializer1015 ret <2 x i64> %c1016}1017 1018define <2 x i64> @loaddup_str_v2i64(ptr %p) {1019; CHECK-SD-LABEL: loaddup_str_v2i64:1020; CHECK-SD: // %bb.0: // %entry1021; CHECK-SD-NEXT: ld1r { v0.2d }, [x0]1022; CHECK-SD-NEXT: str xzr, [x0]1023; CHECK-SD-NEXT: ret1024;1025; CHECK-GI-LABEL: loaddup_str_v2i64:1026; CHECK-GI: // %bb.0: // %entry1027; CHECK-GI-NEXT: ldr d0, [x0]1028; CHECK-GI-NEXT: str xzr, [x0]1029; CHECK-GI-NEXT: dup v0.2d, v0.d[0]1030; CHECK-GI-NEXT: ret1031entry:1032 %a = load i64, ptr %p1033 %b = insertelement <2 x i64> poison, i64 %a, i64 01034 store i64 0, ptr %p1035 %c = shufflevector <2 x i64> %b, <2 x i64> poison, <2 x i32> zeroinitializer1036 ret <2 x i64> %c1037}1038 1039define <3 x i64> @dup_v3i64(i64 %a) {1040; CHECK-SD-LABEL: dup_v3i64:1041; CHECK-SD: // %bb.0: // %entry1042; CHECK-SD-NEXT: fmov d0, x01043; CHECK-SD-NEXT: fmov d1, d01044; CHECK-SD-NEXT: fmov d2, d01045; CHECK-SD-NEXT: ret1046;1047; CHECK-GI-LABEL: dup_v3i64:1048; CHECK-GI: // %bb.0: // %entry1049; CHECK-GI-NEXT: dup v0.2d, x01050; CHECK-GI-NEXT: mov d1, v0.d[1]1051; CHECK-GI-NEXT: fmov d2, d01052; CHECK-GI-NEXT: ret1053entry:1054 %b = insertelement <3 x i64> poison, i64 %a, i64 01055 %c = shufflevector <3 x i64> %b, <3 x i64> poison, <3 x i32> zeroinitializer1056 ret <3 x i64> %c1057}1058 1059define <3 x i64> @duplane0_v3i64(<3 x i64> %b) {1060; CHECK-SD-LABEL: duplane0_v3i64:1061; CHECK-SD: // %bb.0: // %entry1062; CHECK-SD-NEXT: fmov d1, d01063; CHECK-SD-NEXT: fmov d2, d01064; CHECK-SD-NEXT: ret1065;1066; CHECK-GI-LABEL: duplane0_v3i64:1067; CHECK-GI: // %bb.0: // %entry1068; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q01069; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q11070; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]1071; CHECK-GI-NEXT: dup v0.2d, v0.d[0]1072; CHECK-GI-NEXT: mov d1, v0.d[1]1073; CHECK-GI-NEXT: fmov d2, d01074; CHECK-GI-NEXT: ret1075entry:1076 %c = shufflevector <3 x i64> %b, <3 x i64> poison, <3 x i32> zeroinitializer1077 ret <3 x i64> %c1078}1079 1080define <3 x i64> @loaddup_v3i64(ptr %p) {1081; CHECK-SD-LABEL: loaddup_v3i64:1082; CHECK-SD: // %bb.0: // %entry1083; CHECK-SD-NEXT: ldr d0, [x0]1084; CHECK-SD-NEXT: fmov d1, d01085; CHECK-SD-NEXT: fmov d2, d01086; CHECK-SD-NEXT: ret1087;1088; CHECK-GI-LABEL: loaddup_v3i64:1089; CHECK-GI: // %bb.0: // %entry1090; CHECK-GI-NEXT: ld1r { v0.2d }, [x0]1091; CHECK-GI-NEXT: ld1r { v2.2d }, [x0]1092; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q21093; CHECK-GI-NEXT: mov d1, v0.d[1]1094; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q01095; CHECK-GI-NEXT: ret1096entry:1097 %a = load i64, ptr %p1098 %b = insertelement <3 x i64> poison, i64 %a, i64 01099 %c = shufflevector <3 x i64> %b, <3 x i64> poison, <3 x i32> zeroinitializer1100 ret <3 x i64> %c1101}1102 1103define <3 x i64> @loaddup_str_v3i64(ptr %p) {1104; CHECK-SD-LABEL: loaddup_str_v3i64:1105; CHECK-SD: // %bb.0: // %entry1106; CHECK-SD-NEXT: ldr d0, [x0]1107; CHECK-SD-NEXT: str xzr, [x0]1108; CHECK-SD-NEXT: fmov d1, d01109; CHECK-SD-NEXT: fmov d2, d01110; CHECK-SD-NEXT: ret1111;1112; CHECK-GI-LABEL: loaddup_str_v3i64:1113; CHECK-GI: // %bb.0: // %entry1114; CHECK-GI-NEXT: ldr d2, [x0]1115; CHECK-GI-NEXT: str xzr, [x0]1116; CHECK-GI-NEXT: dup v0.2d, v2.d[0]1117; CHECK-GI-NEXT: dup v2.2d, v2.d[0]1118; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q21119; CHECK-GI-NEXT: mov d1, v0.d[1]1120; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q01121; CHECK-GI-NEXT: ret1122entry:1123 %a = load i64, ptr %p1124 %b = insertelement <3 x i64> poison, i64 %a, i64 01125 store i64 0, ptr %p1126 %c = shufflevector <3 x i64> %b, <3 x i64> poison, <3 x i32> zeroinitializer1127 ret <3 x i64> %c1128}1129 1130define <4 x i64> @dup_v4i64(i64 %a) {1131; CHECK-LABEL: dup_v4i64:1132; CHECK: // %bb.0: // %entry1133; CHECK-NEXT: dup v0.2d, x01134; CHECK-NEXT: mov v1.16b, v0.16b1135; CHECK-NEXT: ret1136entry:1137 %b = insertelement <4 x i64> poison, i64 %a, i64 01138 %c = shufflevector <4 x i64> %b, <4 x i64> poison, <4 x i32> zeroinitializer1139 ret <4 x i64> %c1140}1141 1142define <4 x i64> @duplane0_v4i64(<4 x i64> %b) {1143; CHECK-LABEL: duplane0_v4i64:1144; CHECK: // %bb.0: // %entry1145; CHECK-NEXT: dup v0.2d, v0.d[0]1146; CHECK-NEXT: mov v1.16b, v0.16b1147; CHECK-NEXT: ret1148entry:1149 %c = shufflevector <4 x i64> %b, <4 x i64> poison, <4 x i32> zeroinitializer1150 ret <4 x i64> %c1151}1152 1153define <4 x i64> @loaddup_v4i64(ptr %p) {1154; CHECK-SD-LABEL: loaddup_v4i64:1155; CHECK-SD: // %bb.0: // %entry1156; CHECK-SD-NEXT: ld1r { v0.2d }, [x0]1157; CHECK-SD-NEXT: mov v1.16b, v0.16b1158; CHECK-SD-NEXT: ret1159;1160; CHECK-GI-LABEL: loaddup_v4i64:1161; CHECK-GI: // %bb.0: // %entry1162; CHECK-GI-NEXT: ld1r { v0.2d }, [x0]1163; CHECK-GI-NEXT: ld1r { v1.2d }, [x0]1164; CHECK-GI-NEXT: ret1165entry:1166 %a = load i64, ptr %p1167 %b = insertelement <4 x i64> poison, i64 %a, i64 01168 %c = shufflevector <4 x i64> %b, <4 x i64> poison, <4 x i32> zeroinitializer1169 ret <4 x i64> %c1170}1171 1172define <4 x i64> @loaddup_str_v4i64(ptr %p) {1173; CHECK-SD-LABEL: loaddup_str_v4i64:1174; CHECK-SD: // %bb.0: // %entry1175; CHECK-SD-NEXT: ld1r { v0.2d }, [x0]1176; CHECK-SD-NEXT: str xzr, [x0]1177; CHECK-SD-NEXT: mov v1.16b, v0.16b1178; CHECK-SD-NEXT: ret1179;1180; CHECK-GI-LABEL: loaddup_str_v4i64:1181; CHECK-GI: // %bb.0: // %entry1182; CHECK-GI-NEXT: ldr d1, [x0]1183; CHECK-GI-NEXT: str xzr, [x0]1184; CHECK-GI-NEXT: dup v0.2d, v1.d[0]1185; CHECK-GI-NEXT: dup v1.2d, v1.d[0]1186; CHECK-GI-NEXT: ret1187entry:1188 %a = load i64, ptr %p1189 %b = insertelement <4 x i64> poison, i64 %a, i64 01190 store i64 0, ptr %p1191 %c = shufflevector <4 x i64> %b, <4 x i64> poison, <4 x i32> zeroinitializer1192 ret <4 x i64> %c1193}1194 1195define <2 x i128> @dup_v2i128(i128 %a) {1196; CHECK-LABEL: dup_v2i128:1197; CHECK: // %bb.0: // %entry1198; CHECK-NEXT: mov x2, x01199; CHECK-NEXT: mov x3, x11200; CHECK-NEXT: ret1201entry:1202 %b = insertelement <2 x i128> poison, i128 %a, i64 01203 %c = shufflevector <2 x i128> %b, <2 x i128> poison, <2 x i32> zeroinitializer1204 ret <2 x i128> %c1205}1206 1207define <2 x i128> @duplane0_v2i128(<2 x i128> %b) {1208; CHECK-LABEL: duplane0_v2i128:1209; CHECK: // %bb.0: // %entry1210; CHECK-NEXT: mov x2, x01211; CHECK-NEXT: mov x3, x11212; CHECK-NEXT: ret1213entry:1214 %c = shufflevector <2 x i128> %b, <2 x i128> poison, <2 x i32> zeroinitializer1215 ret <2 x i128> %c1216}1217 1218define <2 x i128> @loaddup_v2i128(ptr %p) {1219; CHECK-SD-LABEL: loaddup_v2i128:1220; CHECK-SD: // %bb.0: // %entry1221; CHECK-SD-NEXT: ldp x2, x1, [x0]1222; CHECK-SD-NEXT: mov x0, x21223; CHECK-SD-NEXT: mov x3, x11224; CHECK-SD-NEXT: ret1225;1226; CHECK-GI-LABEL: loaddup_v2i128:1227; CHECK-GI: // %bb.0: // %entry1228; CHECK-GI-NEXT: ldr q0, [x0]1229; CHECK-GI-NEXT: mov d1, v0.d[1]1230; CHECK-GI-NEXT: fmov x0, d01231; CHECK-GI-NEXT: fmov x2, d01232; CHECK-GI-NEXT: fmov x1, d11233; CHECK-GI-NEXT: fmov x3, d11234; CHECK-GI-NEXT: ret1235entry:1236 %a = load i128, ptr %p1237 %b = insertelement <2 x i128> poison, i128 %a, i64 01238 %c = shufflevector <2 x i128> %b, <2 x i128> poison, <2 x i32> zeroinitializer1239 ret <2 x i128> %c1240}1241 1242define <2 x i128> @loaddup_str_v2i128(ptr %p) {1243; CHECK-SD-LABEL: loaddup_str_v2i128:1244; CHECK-SD: // %bb.0: // %entry1245; CHECK-SD-NEXT: mov x8, x01246; CHECK-SD-NEXT: ldr x0, [x0]1247; CHECK-SD-NEXT: ldr x1, [x8, #8]1248; CHECK-SD-NEXT: stp xzr, xzr, [x8]1249; CHECK-SD-NEXT: mov x2, x01250; CHECK-SD-NEXT: mov x3, x11251; CHECK-SD-NEXT: ret1252;1253; CHECK-GI-LABEL: loaddup_str_v2i128:1254; CHECK-GI: // %bb.0: // %entry1255; CHECK-GI-NEXT: ldr q1, [x0]1256; CHECK-GI-NEXT: mov v0.d[0], xzr1257; CHECK-GI-NEXT: mov x8, x01258; CHECK-GI-NEXT: mov d2, v1.d[1]1259; CHECK-GI-NEXT: fmov x0, d11260; CHECK-GI-NEXT: fmov x2, d11261; CHECK-GI-NEXT: mov v0.d[1], xzr1262; CHECK-GI-NEXT: fmov x1, d21263; CHECK-GI-NEXT: fmov x3, d21264; CHECK-GI-NEXT: str q0, [x8]1265; CHECK-GI-NEXT: ret1266entry:1267 %a = load i128, ptr %p1268 %b = insertelement <2 x i128> poison, i128 %a, i64 01269 store i128 0, ptr %p1270 %c = shufflevector <2 x i128> %b, <2 x i128> poison, <2 x i32> zeroinitializer1271 ret <2 x i128> %c1272}1273 1274define <3 x i128> @dup_v3i128(i128 %a) {1275; CHECK-LABEL: dup_v3i128:1276; CHECK: // %bb.0: // %entry1277; CHECK-NEXT: mov x2, x01278; CHECK-NEXT: mov x3, x11279; CHECK-NEXT: mov x4, x01280; CHECK-NEXT: mov x5, x11281; CHECK-NEXT: ret1282entry:1283 %b = insertelement <3 x i128> poison, i128 %a, i64 01284 %c = shufflevector <3 x i128> %b, <3 x i128> poison, <3 x i32> zeroinitializer1285 ret <3 x i128> %c1286}1287 1288define <3 x i128> @duplane0_v3i128(<3 x i128> %b) {1289; CHECK-LABEL: duplane0_v3i128:1290; CHECK: // %bb.0: // %entry1291; CHECK-NEXT: mov x2, x01292; CHECK-NEXT: mov x3, x11293; CHECK-NEXT: mov x4, x01294; CHECK-NEXT: mov x5, x11295; CHECK-NEXT: ret1296entry:1297 %c = shufflevector <3 x i128> %b, <3 x i128> poison, <3 x i32> zeroinitializer1298 ret <3 x i128> %c1299}1300 1301define <3 x i128> @loaddup_v3i128(ptr %p) {1302; CHECK-SD-LABEL: loaddup_v3i128:1303; CHECK-SD: // %bb.0: // %entry1304; CHECK-SD-NEXT: ldp x2, x1, [x0]1305; CHECK-SD-NEXT: mov x0, x21306; CHECK-SD-NEXT: mov x3, x11307; CHECK-SD-NEXT: mov x4, x21308; CHECK-SD-NEXT: mov x5, x11309; CHECK-SD-NEXT: ret1310;1311; CHECK-GI-LABEL: loaddup_v3i128:1312; CHECK-GI: // %bb.0: // %entry1313; CHECK-GI-NEXT: ldr q0, [x0]1314; CHECK-GI-NEXT: mov d1, v0.d[1]1315; CHECK-GI-NEXT: fmov x0, d01316; CHECK-GI-NEXT: fmov x2, d01317; CHECK-GI-NEXT: fmov x4, d01318; CHECK-GI-NEXT: fmov x1, d11319; CHECK-GI-NEXT: fmov x3, d11320; CHECK-GI-NEXT: fmov x5, d11321; CHECK-GI-NEXT: ret1322entry:1323 %a = load i128, ptr %p1324 %b = insertelement <3 x i128> poison, i128 %a, i64 01325 %c = shufflevector <3 x i128> %b, <3 x i128> poison, <3 x i32> zeroinitializer1326 ret <3 x i128> %c1327}1328 1329define <3 x i128> @loaddup_str_v3i128(ptr %p) {1330; CHECK-SD-LABEL: loaddup_str_v3i128:1331; CHECK-SD: // %bb.0: // %entry1332; CHECK-SD-NEXT: mov x8, x01333; CHECK-SD-NEXT: ldp x0, x1, [x0]1334; CHECK-SD-NEXT: stp xzr, xzr, [x8]1335; CHECK-SD-NEXT: mov x2, x01336; CHECK-SD-NEXT: mov x3, x11337; CHECK-SD-NEXT: mov x4, x01338; CHECK-SD-NEXT: mov x5, x11339; CHECK-SD-NEXT: ret1340;1341; CHECK-GI-LABEL: loaddup_str_v3i128:1342; CHECK-GI: // %bb.0: // %entry1343; CHECK-GI-NEXT: ldr q1, [x0]1344; CHECK-GI-NEXT: mov v0.d[0], xzr1345; CHECK-GI-NEXT: mov x8, x01346; CHECK-GI-NEXT: mov d2, v1.d[1]1347; CHECK-GI-NEXT: fmov x0, d11348; CHECK-GI-NEXT: fmov x2, d11349; CHECK-GI-NEXT: fmov x4, d11350; CHECK-GI-NEXT: mov v0.d[1], xzr1351; CHECK-GI-NEXT: fmov x1, d21352; CHECK-GI-NEXT: fmov x3, d21353; CHECK-GI-NEXT: fmov x5, d21354; CHECK-GI-NEXT: str q0, [x8]1355; CHECK-GI-NEXT: ret1356entry:1357 %a = load i128, ptr %p1358 %b = insertelement <3 x i128> poison, i128 %a, i64 01359 store i128 0, ptr %p1360 %c = shufflevector <3 x i128> %b, <3 x i128> poison, <3 x i32> zeroinitializer1361 ret <3 x i128> %c1362}1363 1364define <4 x i128> @dup_v4i128(i128 %a) {1365; CHECK-LABEL: dup_v4i128:1366; CHECK: // %bb.0: // %entry1367; CHECK-NEXT: mov x2, x01368; CHECK-NEXT: mov x3, x11369; CHECK-NEXT: mov x4, x01370; CHECK-NEXT: mov x5, x11371; CHECK-NEXT: mov x6, x01372; CHECK-NEXT: mov x7, x11373; CHECK-NEXT: ret1374entry:1375 %b = insertelement <4 x i128> poison, i128 %a, i64 01376 %c = shufflevector <4 x i128> %b, <4 x i128> poison, <4 x i32> zeroinitializer1377 ret <4 x i128> %c1378}1379 1380define <4 x i128> @duplane0_v4i128(<4 x i128> %b) {1381; CHECK-LABEL: duplane0_v4i128:1382; CHECK: // %bb.0: // %entry1383; CHECK-NEXT: mov x2, x01384; CHECK-NEXT: mov x3, x11385; CHECK-NEXT: mov x4, x01386; CHECK-NEXT: mov x5, x11387; CHECK-NEXT: mov x6, x01388; CHECK-NEXT: mov x7, x11389; CHECK-NEXT: ret1390entry:1391 %c = shufflevector <4 x i128> %b, <4 x i128> poison, <4 x i32> zeroinitializer1392 ret <4 x i128> %c1393}1394 1395define <4 x i128> @loaddup_v4i128(ptr %p) {1396; CHECK-SD-LABEL: loaddup_v4i128:1397; CHECK-SD: // %bb.0: // %entry1398; CHECK-SD-NEXT: ldp x2, x1, [x0]1399; CHECK-SD-NEXT: mov x0, x21400; CHECK-SD-NEXT: mov x3, x11401; CHECK-SD-NEXT: mov x4, x21402; CHECK-SD-NEXT: mov x5, x11403; CHECK-SD-NEXT: mov x6, x21404; CHECK-SD-NEXT: mov x7, x11405; CHECK-SD-NEXT: ret1406;1407; CHECK-GI-LABEL: loaddup_v4i128:1408; CHECK-GI: // %bb.0: // %entry1409; CHECK-GI-NEXT: ldr q0, [x0]1410; CHECK-GI-NEXT: mov d1, v0.d[1]1411; CHECK-GI-NEXT: fmov x0, d01412; CHECK-GI-NEXT: fmov x2, d01413; CHECK-GI-NEXT: fmov x4, d01414; CHECK-GI-NEXT: fmov x6, d01415; CHECK-GI-NEXT: fmov x1, d11416; CHECK-GI-NEXT: fmov x3, d11417; CHECK-GI-NEXT: fmov x5, d11418; CHECK-GI-NEXT: fmov x7, d11419; CHECK-GI-NEXT: ret1420entry:1421 %a = load i128, ptr %p1422 %b = insertelement <4 x i128> poison, i128 %a, i64 01423 %c = shufflevector <4 x i128> %b, <4 x i128> poison, <4 x i32> zeroinitializer1424 ret <4 x i128> %c1425}1426 1427define <4 x i128> @loaddup_str_v4i128(ptr %p) {1428; CHECK-SD-LABEL: loaddup_str_v4i128:1429; CHECK-SD: // %bb.0: // %entry1430; CHECK-SD-NEXT: mov x8, x01431; CHECK-SD-NEXT: ldp x0, x1, [x0]1432; CHECK-SD-NEXT: stp xzr, xzr, [x8]1433; CHECK-SD-NEXT: mov x2, x01434; CHECK-SD-NEXT: mov x3, x11435; CHECK-SD-NEXT: mov x4, x01436; CHECK-SD-NEXT: mov x5, x11437; CHECK-SD-NEXT: mov x6, x01438; CHECK-SD-NEXT: mov x7, x11439; CHECK-SD-NEXT: ret1440;1441; CHECK-GI-LABEL: loaddup_str_v4i128:1442; CHECK-GI: // %bb.0: // %entry1443; CHECK-GI-NEXT: ldr q1, [x0]1444; CHECK-GI-NEXT: mov v0.d[0], xzr1445; CHECK-GI-NEXT: mov x8, x01446; CHECK-GI-NEXT: mov d2, v1.d[1]1447; CHECK-GI-NEXT: fmov x0, d11448; CHECK-GI-NEXT: fmov x2, d11449; CHECK-GI-NEXT: fmov x4, d11450; CHECK-GI-NEXT: fmov x6, d11451; CHECK-GI-NEXT: mov v0.d[1], xzr1452; CHECK-GI-NEXT: fmov x1, d21453; CHECK-GI-NEXT: fmov x3, d21454; CHECK-GI-NEXT: fmov x5, d21455; CHECK-GI-NEXT: fmov x7, d21456; CHECK-GI-NEXT: str q0, [x8]1457; CHECK-GI-NEXT: ret1458entry:1459 %a = load i128, ptr %p1460 %b = insertelement <4 x i128> poison, i128 %a, i64 01461 store i128 0, ptr %p1462 %c = shufflevector <4 x i128> %b, <4 x i128> poison, <4 x i32> zeroinitializer1463 ret <4 x i128> %c1464}1465 1466define <2 x half> @dup_v2half(half %a) {1467; CHECK-LABEL: dup_v2half:1468; CHECK: // %bb.0: // %entry1469; CHECK-NEXT: // kill: def $h0 killed $h0 def $q01470; CHECK-NEXT: dup v0.4h, v0.h[0]1471; CHECK-NEXT: ret1472entry:1473 %b = insertelement <2 x half> poison, half %a, i64 01474 %c = shufflevector <2 x half> %b, <2 x half> poison, <2 x i32> zeroinitializer1475 ret <2 x half> %c1476}1477 1478define <2 x half> @duplane0_v2half(<2 x half> %b) {1479; CHECK-LABEL: duplane0_v2half:1480; CHECK: // %bb.0: // %entry1481; CHECK-NEXT: // kill: def $d0 killed $d0 def $q01482; CHECK-NEXT: dup v0.4h, v0.h[0]1483; CHECK-NEXT: ret1484entry:1485 %c = shufflevector <2 x half> %b, <2 x half> poison, <2 x i32> zeroinitializer1486 ret <2 x half> %c1487}1488 1489define <2 x half> @loaddup_v2half(ptr %p) {1490; CHECK-LABEL: loaddup_v2half:1491; CHECK: // %bb.0: // %entry1492; CHECK-NEXT: ld1r { v0.4h }, [x0]1493; CHECK-NEXT: ret1494entry:1495 %a = load half, ptr %p1496 %b = insertelement <2 x half> poison, half %a, i64 01497 %c = shufflevector <2 x half> %b, <2 x half> poison, <2 x i32> zeroinitializer1498 ret <2 x half> %c1499}1500 1501define <2 x half> @loaddup_str_v2half(ptr %p) {1502; CHECK-SD-LABEL: loaddup_str_v2half:1503; CHECK-SD: // %bb.0: // %entry1504; CHECK-SD-NEXT: movi d1, #00000000000000001505; CHECK-SD-NEXT: ld1r { v0.4h }, [x0]1506; CHECK-SD-NEXT: str h1, [x0]1507; CHECK-SD-NEXT: ret1508;1509; CHECK-GI-LABEL: loaddup_str_v2half:1510; CHECK-GI: // %bb.0: // %entry1511; CHECK-GI-NEXT: ldr h0, [x0]1512; CHECK-GI-NEXT: strh wzr, [x0]1513; CHECK-GI-NEXT: dup v0.4h, v0.h[0]1514; CHECK-GI-NEXT: ret1515entry:1516 %a = load half, ptr %p1517 %b = insertelement <2 x half> poison, half %a, i64 01518 store half 0.0, ptr %p1519 %c = shufflevector <2 x half> %b, <2 x half> poison, <2 x i32> zeroinitializer1520 ret <2 x half> %c1521}1522 1523define <3 x half> @dup_v3half(half %a) {1524; CHECK-LABEL: dup_v3half:1525; CHECK: // %bb.0: // %entry1526; CHECK-NEXT: // kill: def $h0 killed $h0 def $q01527; CHECK-NEXT: dup v0.4h, v0.h[0]1528; CHECK-NEXT: ret1529entry:1530 %b = insertelement <3 x half> poison, half %a, i64 01531 %c = shufflevector <3 x half> %b, <3 x half> poison, <3 x i32> zeroinitializer1532 ret <3 x half> %c1533}1534 1535define <3 x half> @duplane0_v3half(<3 x half> %b) {1536; CHECK-LABEL: duplane0_v3half:1537; CHECK: // %bb.0: // %entry1538; CHECK-NEXT: // kill: def $d0 killed $d0 def $q01539; CHECK-NEXT: dup v0.4h, v0.h[0]1540; CHECK-NEXT: ret1541entry:1542 %c = shufflevector <3 x half> %b, <3 x half> poison, <3 x i32> zeroinitializer1543 ret <3 x half> %c1544}1545 1546define <3 x half> @loaddup_v3half(ptr %p) {1547; CHECK-LABEL: loaddup_v3half:1548; CHECK: // %bb.0: // %entry1549; CHECK-NEXT: ld1r { v0.4h }, [x0]1550; CHECK-NEXT: ret1551entry:1552 %a = load half, ptr %p1553 %b = insertelement <3 x half> poison, half %a, i64 01554 %c = shufflevector <3 x half> %b, <3 x half> poison, <3 x i32> zeroinitializer1555 ret <3 x half> %c1556}1557 1558define <3 x half> @loaddup_str_v3half(ptr %p) {1559; CHECK-SD-LABEL: loaddup_str_v3half:1560; CHECK-SD: // %bb.0: // %entry1561; CHECK-SD-NEXT: movi d1, #00000000000000001562; CHECK-SD-NEXT: ld1r { v0.4h }, [x0]1563; CHECK-SD-NEXT: str h1, [x0]1564; CHECK-SD-NEXT: ret1565;1566; CHECK-GI-LABEL: loaddup_str_v3half:1567; CHECK-GI: // %bb.0: // %entry1568; CHECK-GI-NEXT: ldr h0, [x0]1569; CHECK-GI-NEXT: strh wzr, [x0]1570; CHECK-GI-NEXT: dup v0.4h, v0.h[0]1571; CHECK-GI-NEXT: ret1572entry:1573 %a = load half, ptr %p1574 %b = insertelement <3 x half> poison, half %a, i64 01575 store half 0.0, ptr %p1576 %c = shufflevector <3 x half> %b, <3 x half> poison, <3 x i32> zeroinitializer1577 ret <3 x half> %c1578}1579 1580define <4 x half> @dup_v4half(half %a) {1581; CHECK-LABEL: dup_v4half:1582; CHECK: // %bb.0: // %entry1583; CHECK-NEXT: // kill: def $h0 killed $h0 def $q01584; CHECK-NEXT: dup v0.4h, v0.h[0]1585; CHECK-NEXT: ret1586entry:1587 %b = insertelement <4 x half> poison, half %a, i64 01588 %c = shufflevector <4 x half> %b, <4 x half> poison, <4 x i32> zeroinitializer1589 ret <4 x half> %c1590}1591 1592define <4 x half> @duplane0_v4half(<4 x half> %b) {1593; CHECK-LABEL: duplane0_v4half:1594; CHECK: // %bb.0: // %entry1595; CHECK-NEXT: // kill: def $d0 killed $d0 def $q01596; CHECK-NEXT: dup v0.4h, v0.h[0]1597; CHECK-NEXT: ret1598entry:1599 %c = shufflevector <4 x half> %b, <4 x half> poison, <4 x i32> zeroinitializer1600 ret <4 x half> %c1601}1602 1603define <4 x half> @loaddup_v4half(ptr %p) {1604; CHECK-LABEL: loaddup_v4half:1605; CHECK: // %bb.0: // %entry1606; CHECK-NEXT: ld1r { v0.4h }, [x0]1607; CHECK-NEXT: ret1608entry:1609 %a = load half, ptr %p1610 %b = insertelement <4 x half> poison, half %a, i64 01611 %c = shufflevector <4 x half> %b, <4 x half> poison, <4 x i32> zeroinitializer1612 ret <4 x half> %c1613}1614 1615define <4 x half> @loaddup_str_v4half(ptr %p) {1616; CHECK-SD-LABEL: loaddup_str_v4half:1617; CHECK-SD: // %bb.0: // %entry1618; CHECK-SD-NEXT: movi d1, #00000000000000001619; CHECK-SD-NEXT: ld1r { v0.4h }, [x0]1620; CHECK-SD-NEXT: str h1, [x0]1621; CHECK-SD-NEXT: ret1622;1623; CHECK-GI-LABEL: loaddup_str_v4half:1624; CHECK-GI: // %bb.0: // %entry1625; CHECK-GI-NEXT: ldr h0, [x0]1626; CHECK-GI-NEXT: strh wzr, [x0]1627; CHECK-GI-NEXT: dup v0.4h, v0.h[0]1628; CHECK-GI-NEXT: ret1629entry:1630 %a = load half, ptr %p1631 %b = insertelement <4 x half> poison, half %a, i64 01632 store half 0.0, ptr %p1633 %c = shufflevector <4 x half> %b, <4 x half> poison, <4 x i32> zeroinitializer1634 ret <4 x half> %c1635}1636 1637define <8 x half> @dup_v8half(half %a) {1638; CHECK-LABEL: dup_v8half:1639; CHECK: // %bb.0: // %entry1640; CHECK-NEXT: // kill: def $h0 killed $h0 def $q01641; CHECK-NEXT: dup v0.8h, v0.h[0]1642; CHECK-NEXT: ret1643entry:1644 %b = insertelement <8 x half> poison, half %a, i64 01645 %c = shufflevector <8 x half> %b, <8 x half> poison, <8 x i32> zeroinitializer1646 ret <8 x half> %c1647}1648 1649define <8 x half> @duplane0_v8half(<8 x half> %b) {1650; CHECK-LABEL: duplane0_v8half:1651; CHECK: // %bb.0: // %entry1652; CHECK-NEXT: dup v0.8h, v0.h[0]1653; CHECK-NEXT: ret1654entry:1655 %c = shufflevector <8 x half> %b, <8 x half> poison, <8 x i32> zeroinitializer1656 ret <8 x half> %c1657}1658 1659define <8 x half> @loaddup_v8half(ptr %p) {1660; CHECK-LABEL: loaddup_v8half:1661; CHECK: // %bb.0: // %entry1662; CHECK-NEXT: ld1r { v0.8h }, [x0]1663; CHECK-NEXT: ret1664entry:1665 %a = load half, ptr %p1666 %b = insertelement <8 x half> poison, half %a, i64 01667 %c = shufflevector <8 x half> %b, <8 x half> poison, <8 x i32> zeroinitializer1668 ret <8 x half> %c1669}1670 1671define <8 x half> @loaddup_str_v8half(ptr %p) {1672; CHECK-SD-LABEL: loaddup_str_v8half:1673; CHECK-SD: // %bb.0: // %entry1674; CHECK-SD-NEXT: movi d1, #00000000000000001675; CHECK-SD-NEXT: ld1r { v0.8h }, [x0]1676; CHECK-SD-NEXT: str h1, [x0]1677; CHECK-SD-NEXT: ret1678;1679; CHECK-GI-LABEL: loaddup_str_v8half:1680; CHECK-GI: // %bb.0: // %entry1681; CHECK-GI-NEXT: ldr h0, [x0]1682; CHECK-GI-NEXT: strh wzr, [x0]1683; CHECK-GI-NEXT: dup v0.8h, v0.h[0]1684; CHECK-GI-NEXT: ret1685entry:1686 %a = load half, ptr %p1687 %b = insertelement <8 x half> poison, half %a, i64 01688 store half 0.0, ptr %p1689 %c = shufflevector <8 x half> %b, <8 x half> poison, <8 x i32> zeroinitializer1690 ret <8 x half> %c1691}1692 1693define <16 x half> @dup_v16half(half %a) {1694; CHECK-SD-LABEL: dup_v16half:1695; CHECK-SD: // %bb.0: // %entry1696; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $q01697; CHECK-SD-NEXT: dup v0.8h, v0.h[0]1698; CHECK-SD-NEXT: mov v1.16b, v0.16b1699; CHECK-SD-NEXT: ret1700;1701; CHECK-GI-LABEL: dup_v16half:1702; CHECK-GI: // %bb.0: // %entry1703; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $q01704; CHECK-GI-NEXT: dup v2.8h, v0.h[0]1705; CHECK-GI-NEXT: dup v1.8h, v0.h[0]1706; CHECK-GI-NEXT: mov v0.16b, v2.16b1707; CHECK-GI-NEXT: ret1708entry:1709 %b = insertelement <16 x half> poison, half %a, i64 01710 %c = shufflevector <16 x half> %b, <16 x half> poison, <16 x i32> zeroinitializer1711 ret <16 x half> %c1712}1713 1714define <16 x half> @duplane0_v16half(<16 x half> %b) {1715; CHECK-LABEL: duplane0_v16half:1716; CHECK: // %bb.0: // %entry1717; CHECK-NEXT: dup v0.8h, v0.h[0]1718; CHECK-NEXT: mov v1.16b, v0.16b1719; CHECK-NEXT: ret1720entry:1721 %c = shufflevector <16 x half> %b, <16 x half> poison, <16 x i32> zeroinitializer1722 ret <16 x half> %c1723}1724 1725define <16 x half> @loaddup_v16half(ptr %p) {1726; CHECK-SD-LABEL: loaddup_v16half:1727; CHECK-SD: // %bb.0: // %entry1728; CHECK-SD-NEXT: ld1r { v0.8h }, [x0]1729; CHECK-SD-NEXT: mov v1.16b, v0.16b1730; CHECK-SD-NEXT: ret1731;1732; CHECK-GI-LABEL: loaddup_v16half:1733; CHECK-GI: // %bb.0: // %entry1734; CHECK-GI-NEXT: ld1r { v0.8h }, [x0]1735; CHECK-GI-NEXT: ld1r { v1.8h }, [x0]1736; CHECK-GI-NEXT: ret1737entry:1738 %a = load half, ptr %p1739 %b = insertelement <16 x half> poison, half %a, i64 01740 %c = shufflevector <16 x half> %b, <16 x half> poison, <16 x i32> zeroinitializer1741 ret <16 x half> %c1742}1743 1744define <16 x half> @loaddup_str_v16half(ptr %p) {1745; CHECK-SD-LABEL: loaddup_str_v16half:1746; CHECK-SD: // %bb.0: // %entry1747; CHECK-SD-NEXT: ld1r { v0.8h }, [x0]1748; CHECK-SD-NEXT: movi d2, #00000000000000001749; CHECK-SD-NEXT: mov v1.16b, v0.16b1750; CHECK-SD-NEXT: str h2, [x0]1751; CHECK-SD-NEXT: ret1752;1753; CHECK-GI-LABEL: loaddup_str_v16half:1754; CHECK-GI: // %bb.0: // %entry1755; CHECK-GI-NEXT: ldr h1, [x0]1756; CHECK-GI-NEXT: strh wzr, [x0]1757; CHECK-GI-NEXT: dup v0.8h, v1.h[0]1758; CHECK-GI-NEXT: dup v1.8h, v1.h[0]1759; CHECK-GI-NEXT: ret1760entry:1761 %a = load half, ptr %p1762 %b = insertelement <16 x half> poison, half %a, i64 01763 store half 0.0, ptr %p1764 %c = shufflevector <16 x half> %b, <16 x half> poison, <16 x i32> zeroinitializer1765 ret <16 x half> %c1766}1767 1768define <2 x bfloat> @dup_v2bfloat(bfloat %a) {1769; CHECK-LABEL: dup_v2bfloat:1770; CHECK: // %bb.0: // %entry1771; CHECK-NEXT: // kill: def $h0 killed $h0 def $q01772; CHECK-NEXT: dup v0.4h, v0.h[0]1773; CHECK-NEXT: ret1774entry:1775 %b = insertelement <2 x bfloat> poison, bfloat %a, i64 01776 %c = shufflevector <2 x bfloat> %b, <2 x bfloat> poison, <2 x i32> zeroinitializer1777 ret <2 x bfloat> %c1778}1779 1780define <2 x bfloat> @duplane0_v2bfloat(<2 x bfloat> %b) {1781; CHECK-LABEL: duplane0_v2bfloat:1782; CHECK: // %bb.0: // %entry1783; CHECK-NEXT: // kill: def $d0 killed $d0 def $q01784; CHECK-NEXT: dup v0.4h, v0.h[0]1785; CHECK-NEXT: ret1786entry:1787 %c = shufflevector <2 x bfloat> %b, <2 x bfloat> poison, <2 x i32> zeroinitializer1788 ret <2 x bfloat> %c1789}1790 1791define <2 x bfloat> @loaddup_v2bfloat(ptr %p) {1792; CHECK-LABEL: loaddup_v2bfloat:1793; CHECK: // %bb.0: // %entry1794; CHECK-NEXT: ld1r { v0.4h }, [x0]1795; CHECK-NEXT: ret1796entry:1797 %a = load bfloat, ptr %p1798 %b = insertelement <2 x bfloat> poison, bfloat %a, i64 01799 %c = shufflevector <2 x bfloat> %b, <2 x bfloat> poison, <2 x i32> zeroinitializer1800 ret <2 x bfloat> %c1801}1802 1803define <2 x bfloat> @loaddup_str_v2bfloat(ptr %p) {1804; CHECK-SD-LABEL: loaddup_str_v2bfloat:1805; CHECK-SD: // %bb.0: // %entry1806; CHECK-SD-NEXT: movi d1, #00000000000000001807; CHECK-SD-NEXT: ld1r { v0.4h }, [x0]1808; CHECK-SD-NEXT: str h1, [x0]1809; CHECK-SD-NEXT: ret1810;1811; CHECK-GI-LABEL: loaddup_str_v2bfloat:1812; CHECK-GI: // %bb.0: // %entry1813; CHECK-GI-NEXT: ldr h0, [x0]1814; CHECK-GI-NEXT: strh wzr, [x0]1815; CHECK-GI-NEXT: dup v0.4h, v0.h[0]1816; CHECK-GI-NEXT: ret1817entry:1818 %a = load bfloat, ptr %p1819 %b = insertelement <2 x bfloat> poison, bfloat %a, i64 01820 store bfloat 0.0, ptr %p1821 %c = shufflevector <2 x bfloat> %b, <2 x bfloat> poison, <2 x i32> zeroinitializer1822 ret <2 x bfloat> %c1823}1824 1825define <3 x bfloat> @dup_v3bfloat(bfloat %a) {1826; CHECK-LABEL: dup_v3bfloat:1827; CHECK: // %bb.0: // %entry1828; CHECK-NEXT: // kill: def $h0 killed $h0 def $q01829; CHECK-NEXT: dup v0.4h, v0.h[0]1830; CHECK-NEXT: ret1831entry:1832 %b = insertelement <3 x bfloat> poison, bfloat %a, i64 01833 %c = shufflevector <3 x bfloat> %b, <3 x bfloat> poison, <3 x i32> zeroinitializer1834 ret <3 x bfloat> %c1835}1836 1837define <3 x bfloat> @duplane0_v3bfloat(<3 x bfloat> %b) {1838; CHECK-LABEL: duplane0_v3bfloat:1839; CHECK: // %bb.0: // %entry1840; CHECK-NEXT: // kill: def $d0 killed $d0 def $q01841; CHECK-NEXT: dup v0.4h, v0.h[0]1842; CHECK-NEXT: ret1843entry:1844 %c = shufflevector <3 x bfloat> %b, <3 x bfloat> poison, <3 x i32> zeroinitializer1845 ret <3 x bfloat> %c1846}1847 1848define <3 x bfloat> @loaddup_v3bfloat(ptr %p) {1849; CHECK-LABEL: loaddup_v3bfloat:1850; CHECK: // %bb.0: // %entry1851; CHECK-NEXT: ld1r { v0.4h }, [x0]1852; CHECK-NEXT: ret1853entry:1854 %a = load bfloat, ptr %p1855 %b = insertelement <3 x bfloat> poison, bfloat %a, i64 01856 %c = shufflevector <3 x bfloat> %b, <3 x bfloat> poison, <3 x i32> zeroinitializer1857 ret <3 x bfloat> %c1858}1859 1860define <3 x bfloat> @loaddup_str_v3bfloat(ptr %p) {1861; CHECK-SD-LABEL: loaddup_str_v3bfloat:1862; CHECK-SD: // %bb.0: // %entry1863; CHECK-SD-NEXT: movi d1, #00000000000000001864; CHECK-SD-NEXT: ld1r { v0.4h }, [x0]1865; CHECK-SD-NEXT: str h1, [x0]1866; CHECK-SD-NEXT: ret1867;1868; CHECK-GI-LABEL: loaddup_str_v3bfloat:1869; CHECK-GI: // %bb.0: // %entry1870; CHECK-GI-NEXT: ldr h0, [x0]1871; CHECK-GI-NEXT: strh wzr, [x0]1872; CHECK-GI-NEXT: dup v0.4h, v0.h[0]1873; CHECK-GI-NEXT: ret1874entry:1875 %a = load bfloat, ptr %p1876 %b = insertelement <3 x bfloat> poison, bfloat %a, i64 01877 store bfloat 0.0, ptr %p1878 %c = shufflevector <3 x bfloat> %b, <3 x bfloat> poison, <3 x i32> zeroinitializer1879 ret <3 x bfloat> %c1880}1881 1882define <4 x bfloat> @dup_v4bfloat(bfloat %a) {1883; CHECK-LABEL: dup_v4bfloat:1884; CHECK: // %bb.0: // %entry1885; CHECK-NEXT: // kill: def $h0 killed $h0 def $q01886; CHECK-NEXT: dup v0.4h, v0.h[0]1887; CHECK-NEXT: ret1888entry:1889 %b = insertelement <4 x bfloat> poison, bfloat %a, i64 01890 %c = shufflevector <4 x bfloat> %b, <4 x bfloat> poison, <4 x i32> zeroinitializer1891 ret <4 x bfloat> %c1892}1893 1894define <4 x bfloat> @duplane0_v4bfloat(<4 x bfloat> %b) {1895; CHECK-LABEL: duplane0_v4bfloat:1896; CHECK: // %bb.0: // %entry1897; CHECK-NEXT: // kill: def $d0 killed $d0 def $q01898; CHECK-NEXT: dup v0.4h, v0.h[0]1899; CHECK-NEXT: ret1900entry:1901 %c = shufflevector <4 x bfloat> %b, <4 x bfloat> poison, <4 x i32> zeroinitializer1902 ret <4 x bfloat> %c1903}1904 1905define <4 x bfloat> @loaddup_v4bfloat(ptr %p) {1906; CHECK-LABEL: loaddup_v4bfloat:1907; CHECK: // %bb.0: // %entry1908; CHECK-NEXT: ld1r { v0.4h }, [x0]1909; CHECK-NEXT: ret1910entry:1911 %a = load bfloat, ptr %p1912 %b = insertelement <4 x bfloat> poison, bfloat %a, i64 01913 %c = shufflevector <4 x bfloat> %b, <4 x bfloat> poison, <4 x i32> zeroinitializer1914 ret <4 x bfloat> %c1915}1916 1917define <4 x bfloat> @loaddup_str_v4bfloat(ptr %p) {1918; CHECK-SD-LABEL: loaddup_str_v4bfloat:1919; CHECK-SD: // %bb.0: // %entry1920; CHECK-SD-NEXT: movi d1, #00000000000000001921; CHECK-SD-NEXT: ld1r { v0.4h }, [x0]1922; CHECK-SD-NEXT: str h1, [x0]1923; CHECK-SD-NEXT: ret1924;1925; CHECK-GI-LABEL: loaddup_str_v4bfloat:1926; CHECK-GI: // %bb.0: // %entry1927; CHECK-GI-NEXT: ldr h0, [x0]1928; CHECK-GI-NEXT: strh wzr, [x0]1929; CHECK-GI-NEXT: dup v0.4h, v0.h[0]1930; CHECK-GI-NEXT: ret1931entry:1932 %a = load bfloat, ptr %p1933 %b = insertelement <4 x bfloat> poison, bfloat %a, i64 01934 store bfloat 0.0, ptr %p1935 %c = shufflevector <4 x bfloat> %b, <4 x bfloat> poison, <4 x i32> zeroinitializer1936 ret <4 x bfloat> %c1937}1938 1939define <8 x bfloat> @dup_v8bfloat(bfloat %a) {1940; CHECK-LABEL: dup_v8bfloat:1941; CHECK: // %bb.0: // %entry1942; CHECK-NEXT: // kill: def $h0 killed $h0 def $q01943; CHECK-NEXT: dup v0.8h, v0.h[0]1944; CHECK-NEXT: ret1945entry:1946 %b = insertelement <8 x bfloat> poison, bfloat %a, i64 01947 %c = shufflevector <8 x bfloat> %b, <8 x bfloat> poison, <8 x i32> zeroinitializer1948 ret <8 x bfloat> %c1949}1950 1951define <8 x bfloat> @duplane0_v8bfloat(<8 x bfloat> %b) {1952; CHECK-LABEL: duplane0_v8bfloat:1953; CHECK: // %bb.0: // %entry1954; CHECK-NEXT: dup v0.8h, v0.h[0]1955; CHECK-NEXT: ret1956entry:1957 %c = shufflevector <8 x bfloat> %b, <8 x bfloat> poison, <8 x i32> zeroinitializer1958 ret <8 x bfloat> %c1959}1960 1961define <8 x bfloat> @loaddup_v8bfloat(ptr %p) {1962; CHECK-LABEL: loaddup_v8bfloat:1963; CHECK: // %bb.0: // %entry1964; CHECK-NEXT: ld1r { v0.8h }, [x0]1965; CHECK-NEXT: ret1966entry:1967 %a = load bfloat, ptr %p1968 %b = insertelement <8 x bfloat> poison, bfloat %a, i64 01969 %c = shufflevector <8 x bfloat> %b, <8 x bfloat> poison, <8 x i32> zeroinitializer1970 ret <8 x bfloat> %c1971}1972 1973define <8 x bfloat> @loaddup_str_v8bfloat(ptr %p) {1974; CHECK-SD-LABEL: loaddup_str_v8bfloat:1975; CHECK-SD: // %bb.0: // %entry1976; CHECK-SD-NEXT: movi d1, #00000000000000001977; CHECK-SD-NEXT: ld1r { v0.8h }, [x0]1978; CHECK-SD-NEXT: str h1, [x0]1979; CHECK-SD-NEXT: ret1980;1981; CHECK-GI-LABEL: loaddup_str_v8bfloat:1982; CHECK-GI: // %bb.0: // %entry1983; CHECK-GI-NEXT: ldr h0, [x0]1984; CHECK-GI-NEXT: strh wzr, [x0]1985; CHECK-GI-NEXT: dup v0.8h, v0.h[0]1986; CHECK-GI-NEXT: ret1987entry:1988 %a = load bfloat, ptr %p1989 %b = insertelement <8 x bfloat> poison, bfloat %a, i64 01990 store bfloat 0.0, ptr %p1991 %c = shufflevector <8 x bfloat> %b, <8 x bfloat> poison, <8 x i32> zeroinitializer1992 ret <8 x bfloat> %c1993}1994 1995define <16 x bfloat> @dup_v16bfloat(bfloat %a) {1996; CHECK-SD-LABEL: dup_v16bfloat:1997; CHECK-SD: // %bb.0: // %entry1998; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $q01999; CHECK-SD-NEXT: dup v0.8h, v0.h[0]2000; CHECK-SD-NEXT: mov v1.16b, v0.16b2001; CHECK-SD-NEXT: ret2002;2003; CHECK-GI-LABEL: dup_v16bfloat:2004; CHECK-GI: // %bb.0: // %entry2005; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $q02006; CHECK-GI-NEXT: dup v2.8h, v0.h[0]2007; CHECK-GI-NEXT: dup v1.8h, v0.h[0]2008; CHECK-GI-NEXT: mov v0.16b, v2.16b2009; CHECK-GI-NEXT: ret2010entry:2011 %b = insertelement <16 x bfloat> poison, bfloat %a, i64 02012 %c = shufflevector <16 x bfloat> %b, <16 x bfloat> poison, <16 x i32> zeroinitializer2013 ret <16 x bfloat> %c2014}2015 2016define <16 x bfloat> @duplane0_v16bfloat(<16 x bfloat> %b) {2017; CHECK-LABEL: duplane0_v16bfloat:2018; CHECK: // %bb.0: // %entry2019; CHECK-NEXT: dup v0.8h, v0.h[0]2020; CHECK-NEXT: mov v1.16b, v0.16b2021; CHECK-NEXT: ret2022entry:2023 %c = shufflevector <16 x bfloat> %b, <16 x bfloat> poison, <16 x i32> zeroinitializer2024 ret <16 x bfloat> %c2025}2026 2027define <16 x bfloat> @loaddup_v16bfloat(ptr %p) {2028; CHECK-SD-LABEL: loaddup_v16bfloat:2029; CHECK-SD: // %bb.0: // %entry2030; CHECK-SD-NEXT: ld1r { v0.8h }, [x0]2031; CHECK-SD-NEXT: mov v1.16b, v0.16b2032; CHECK-SD-NEXT: ret2033;2034; CHECK-GI-LABEL: loaddup_v16bfloat:2035; CHECK-GI: // %bb.0: // %entry2036; CHECK-GI-NEXT: ld1r { v0.8h }, [x0]2037; CHECK-GI-NEXT: ld1r { v1.8h }, [x0]2038; CHECK-GI-NEXT: ret2039entry:2040 %a = load bfloat, ptr %p2041 %b = insertelement <16 x bfloat> poison, bfloat %a, i64 02042 %c = shufflevector <16 x bfloat> %b, <16 x bfloat> poison, <16 x i32> zeroinitializer2043 ret <16 x bfloat> %c2044}2045 2046define <16 x bfloat> @loaddup_str_v16bfloat(ptr %p) {2047; CHECK-SD-LABEL: loaddup_str_v16bfloat:2048; CHECK-SD: // %bb.0: // %entry2049; CHECK-SD-NEXT: ld1r { v0.8h }, [x0]2050; CHECK-SD-NEXT: movi d2, #00000000000000002051; CHECK-SD-NEXT: mov v1.16b, v0.16b2052; CHECK-SD-NEXT: str h2, [x0]2053; CHECK-SD-NEXT: ret2054;2055; CHECK-GI-LABEL: loaddup_str_v16bfloat:2056; CHECK-GI: // %bb.0: // %entry2057; CHECK-GI-NEXT: ldr h1, [x0]2058; CHECK-GI-NEXT: strh wzr, [x0]2059; CHECK-GI-NEXT: dup v0.8h, v1.h[0]2060; CHECK-GI-NEXT: dup v1.8h, v1.h[0]2061; CHECK-GI-NEXT: ret2062entry:2063 %a = load bfloat, ptr %p2064 %b = insertelement <16 x bfloat> poison, bfloat %a, i64 02065 store bfloat 0.0, ptr %p2066 %c = shufflevector <16 x bfloat> %b, <16 x bfloat> poison, <16 x i32> zeroinitializer2067 ret <16 x bfloat> %c2068}2069 2070define <2 x float> @dup_v2float(float %a) {2071; CHECK-LABEL: dup_v2float:2072; CHECK: // %bb.0: // %entry2073; CHECK-NEXT: // kill: def $s0 killed $s0 def $q02074; CHECK-NEXT: dup v0.2s, v0.s[0]2075; CHECK-NEXT: ret2076entry:2077 %b = insertelement <2 x float> poison, float %a, i64 02078 %c = shufflevector <2 x float> %b, <2 x float> poison, <2 x i32> zeroinitializer2079 ret <2 x float> %c2080}2081 2082define <2 x float> @duplane0_v2float(<2 x float> %b) {2083; CHECK-LABEL: duplane0_v2float:2084; CHECK: // %bb.0: // %entry2085; CHECK-NEXT: // kill: def $d0 killed $d0 def $q02086; CHECK-NEXT: dup v0.2s, v0.s[0]2087; CHECK-NEXT: ret2088entry:2089 %c = shufflevector <2 x float> %b, <2 x float> poison, <2 x i32> zeroinitializer2090 ret <2 x float> %c2091}2092 2093define <2 x float> @loaddup_v2float(ptr %p) {2094; CHECK-LABEL: loaddup_v2float:2095; CHECK: // %bb.0: // %entry2096; CHECK-NEXT: ld1r { v0.2s }, [x0]2097; CHECK-NEXT: ret2098entry:2099 %a = load float, ptr %p2100 %b = insertelement <2 x float> poison, float %a, i64 02101 %c = shufflevector <2 x float> %b, <2 x float> poison, <2 x i32> zeroinitializer2102 ret <2 x float> %c2103}2104 2105define <2 x float> @loaddup_str_v2float(ptr %p) {2106; CHECK-SD-LABEL: loaddup_str_v2float:2107; CHECK-SD: // %bb.0: // %entry2108; CHECK-SD-NEXT: ld1r { v0.2s }, [x0]2109; CHECK-SD-NEXT: str wzr, [x0]2110; CHECK-SD-NEXT: ret2111;2112; CHECK-GI-LABEL: loaddup_str_v2float:2113; CHECK-GI: // %bb.0: // %entry2114; CHECK-GI-NEXT: ldr s0, [x0]2115; CHECK-GI-NEXT: str wzr, [x0]2116; CHECK-GI-NEXT: dup v0.2s, v0.s[0]2117; CHECK-GI-NEXT: ret2118entry:2119 %a = load float, ptr %p2120 %b = insertelement <2 x float> poison, float %a, i64 02121 store float 0.0, ptr %p2122 %c = shufflevector <2 x float> %b, <2 x float> poison, <2 x i32> zeroinitializer2123 ret <2 x float> %c2124}2125 2126define <3 x float> @dup_v3float(float %a) {2127; CHECK-LABEL: dup_v3float:2128; CHECK: // %bb.0: // %entry2129; CHECK-NEXT: // kill: def $s0 killed $s0 def $q02130; CHECK-NEXT: dup v0.4s, v0.s[0]2131; CHECK-NEXT: ret2132entry:2133 %b = insertelement <3 x float> poison, float %a, i64 02134 %c = shufflevector <3 x float> %b, <3 x float> poison, <3 x i32> zeroinitializer2135 ret <3 x float> %c2136}2137 2138define <3 x float> @duplane0_v3float(<3 x float> %b) {2139; CHECK-LABEL: duplane0_v3float:2140; CHECK: // %bb.0: // %entry2141; CHECK-NEXT: dup v0.4s, v0.s[0]2142; CHECK-NEXT: ret2143entry:2144 %c = shufflevector <3 x float> %b, <3 x float> poison, <3 x i32> zeroinitializer2145 ret <3 x float> %c2146}2147 2148define <3 x float> @loaddup_v3float(ptr %p) {2149; CHECK-LABEL: loaddup_v3float:2150; CHECK: // %bb.0: // %entry2151; CHECK-NEXT: ld1r { v0.4s }, [x0]2152; CHECK-NEXT: ret2153entry:2154 %a = load float, ptr %p2155 %b = insertelement <3 x float> poison, float %a, i64 02156 %c = shufflevector <3 x float> %b, <3 x float> poison, <3 x i32> zeroinitializer2157 ret <3 x float> %c2158}2159 2160define <3 x float> @loaddup_str_v3float(ptr %p) {2161; CHECK-SD-LABEL: loaddup_str_v3float:2162; CHECK-SD: // %bb.0: // %entry2163; CHECK-SD-NEXT: ld1r { v0.4s }, [x0]2164; CHECK-SD-NEXT: str wzr, [x0]2165; CHECK-SD-NEXT: ret2166;2167; CHECK-GI-LABEL: loaddup_str_v3float:2168; CHECK-GI: // %bb.0: // %entry2169; CHECK-GI-NEXT: ldr s0, [x0]2170; CHECK-GI-NEXT: str wzr, [x0]2171; CHECK-GI-NEXT: dup v0.4s, v0.s[0]2172; CHECK-GI-NEXT: ret2173entry:2174 %a = load float, ptr %p2175 %b = insertelement <3 x float> poison, float %a, i64 02176 store float 0.0, ptr %p2177 %c = shufflevector <3 x float> %b, <3 x float> poison, <3 x i32> zeroinitializer2178 ret <3 x float> %c2179}2180 2181define <4 x float> @dup_v4float(float %a) {2182; CHECK-LABEL: dup_v4float:2183; CHECK: // %bb.0: // %entry2184; CHECK-NEXT: // kill: def $s0 killed $s0 def $q02185; CHECK-NEXT: dup v0.4s, v0.s[0]2186; CHECK-NEXT: ret2187entry:2188 %b = insertelement <4 x float> poison, float %a, i64 02189 %c = shufflevector <4 x float> %b, <4 x float> poison, <4 x i32> zeroinitializer2190 ret <4 x float> %c2191}2192 2193define <4 x float> @duplane0_v4float(<4 x float> %b) {2194; CHECK-LABEL: duplane0_v4float:2195; CHECK: // %bb.0: // %entry2196; CHECK-NEXT: dup v0.4s, v0.s[0]2197; CHECK-NEXT: ret2198entry:2199 %c = shufflevector <4 x float> %b, <4 x float> poison, <4 x i32> zeroinitializer2200 ret <4 x float> %c2201}2202 2203define <4 x float> @loaddup_v4float(ptr %p) {2204; CHECK-LABEL: loaddup_v4float:2205; CHECK: // %bb.0: // %entry2206; CHECK-NEXT: ld1r { v0.4s }, [x0]2207; CHECK-NEXT: ret2208entry:2209 %a = load float, ptr %p2210 %b = insertelement <4 x float> poison, float %a, i64 02211 %c = shufflevector <4 x float> %b, <4 x float> poison, <4 x i32> zeroinitializer2212 ret <4 x float> %c2213}2214 2215define <4 x float> @loaddup_str_v4float(ptr %p) {2216; CHECK-SD-LABEL: loaddup_str_v4float:2217; CHECK-SD: // %bb.0: // %entry2218; CHECK-SD-NEXT: ld1r { v0.4s }, [x0]2219; CHECK-SD-NEXT: str wzr, [x0]2220; CHECK-SD-NEXT: ret2221;2222; CHECK-GI-LABEL: loaddup_str_v4float:2223; CHECK-GI: // %bb.0: // %entry2224; CHECK-GI-NEXT: ldr s0, [x0]2225; CHECK-GI-NEXT: str wzr, [x0]2226; CHECK-GI-NEXT: dup v0.4s, v0.s[0]2227; CHECK-GI-NEXT: ret2228entry:2229 %a = load float, ptr %p2230 %b = insertelement <4 x float> poison, float %a, i64 02231 store float 0.0, ptr %p2232 %c = shufflevector <4 x float> %b, <4 x float> poison, <4 x i32> zeroinitializer2233 ret <4 x float> %c2234}2235 2236define <8 x float> @dup_v8float(float %a) {2237; CHECK-SD-LABEL: dup_v8float:2238; CHECK-SD: // %bb.0: // %entry2239; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q02240; CHECK-SD-NEXT: dup v0.4s, v0.s[0]2241; CHECK-SD-NEXT: mov v1.16b, v0.16b2242; CHECK-SD-NEXT: ret2243;2244; CHECK-GI-LABEL: dup_v8float:2245; CHECK-GI: // %bb.0: // %entry2246; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q02247; CHECK-GI-NEXT: dup v2.4s, v0.s[0]2248; CHECK-GI-NEXT: dup v1.4s, v0.s[0]2249; CHECK-GI-NEXT: mov v0.16b, v2.16b2250; CHECK-GI-NEXT: ret2251entry:2252 %b = insertelement <8 x float> poison, float %a, i64 02253 %c = shufflevector <8 x float> %b, <8 x float> poison, <8 x i32> zeroinitializer2254 ret <8 x float> %c2255}2256 2257define <8 x float> @duplane0_v8float(<8 x float> %b) {2258; CHECK-LABEL: duplane0_v8float:2259; CHECK: // %bb.0: // %entry2260; CHECK-NEXT: dup v0.4s, v0.s[0]2261; CHECK-NEXT: mov v1.16b, v0.16b2262; CHECK-NEXT: ret2263entry:2264 %c = shufflevector <8 x float> %b, <8 x float> poison, <8 x i32> zeroinitializer2265 ret <8 x float> %c2266}2267 2268define <8 x float> @loaddup_v8float(ptr %p) {2269; CHECK-SD-LABEL: loaddup_v8float:2270; CHECK-SD: // %bb.0: // %entry2271; CHECK-SD-NEXT: ld1r { v0.4s }, [x0]2272; CHECK-SD-NEXT: mov v1.16b, v0.16b2273; CHECK-SD-NEXT: ret2274;2275; CHECK-GI-LABEL: loaddup_v8float:2276; CHECK-GI: // %bb.0: // %entry2277; CHECK-GI-NEXT: ld1r { v0.4s }, [x0]2278; CHECK-GI-NEXT: ld1r { v1.4s }, [x0]2279; CHECK-GI-NEXT: ret2280entry:2281 %a = load float, ptr %p2282 %b = insertelement <8 x float> poison, float %a, i64 02283 %c = shufflevector <8 x float> %b, <8 x float> poison, <8 x i32> zeroinitializer2284 ret <8 x float> %c2285}2286 2287define <8 x float> @loaddup_str_v8float(ptr %p) {2288; CHECK-SD-LABEL: loaddup_str_v8float:2289; CHECK-SD: // %bb.0: // %entry2290; CHECK-SD-NEXT: ld1r { v0.4s }, [x0]2291; CHECK-SD-NEXT: str wzr, [x0]2292; CHECK-SD-NEXT: mov v1.16b, v0.16b2293; CHECK-SD-NEXT: ret2294;2295; CHECK-GI-LABEL: loaddup_str_v8float:2296; CHECK-GI: // %bb.0: // %entry2297; CHECK-GI-NEXT: ldr s1, [x0]2298; CHECK-GI-NEXT: str wzr, [x0]2299; CHECK-GI-NEXT: dup v0.4s, v1.s[0]2300; CHECK-GI-NEXT: dup v1.4s, v1.s[0]2301; CHECK-GI-NEXT: ret2302entry:2303 %a = load float, ptr %p2304 %b = insertelement <8 x float> poison, float %a, i64 02305 store float 0.0, ptr %p2306 %c = shufflevector <8 x float> %b, <8 x float> poison, <8 x i32> zeroinitializer2307 ret <8 x float> %c2308}2309 2310define <2 x double> @dup_v2double(double %a) {2311; CHECK-LABEL: dup_v2double:2312; CHECK: // %bb.0: // %entry2313; CHECK-NEXT: // kill: def $d0 killed $d0 def $q02314; CHECK-NEXT: dup v0.2d, v0.d[0]2315; CHECK-NEXT: ret2316entry:2317 %b = insertelement <2 x double> poison, double %a, i64 02318 %c = shufflevector <2 x double> %b, <2 x double> poison, <2 x i32> zeroinitializer2319 ret <2 x double> %c2320}2321 2322define <2 x double> @duplane0_v2double(<2 x double> %b) {2323; CHECK-LABEL: duplane0_v2double:2324; CHECK: // %bb.0: // %entry2325; CHECK-NEXT: dup v0.2d, v0.d[0]2326; CHECK-NEXT: ret2327entry:2328 %c = shufflevector <2 x double> %b, <2 x double> poison, <2 x i32> zeroinitializer2329 ret <2 x double> %c2330}2331 2332define <2 x double> @loaddup_v2double(ptr %p) {2333; CHECK-LABEL: loaddup_v2double:2334; CHECK: // %bb.0: // %entry2335; CHECK-NEXT: ld1r { v0.2d }, [x0]2336; CHECK-NEXT: ret2337entry:2338 %a = load double, ptr %p2339 %b = insertelement <2 x double> poison, double %a, i64 02340 %c = shufflevector <2 x double> %b, <2 x double> poison, <2 x i32> zeroinitializer2341 ret <2 x double> %c2342}2343 2344define <2 x double> @loaddup_str_v2double(ptr %p) {2345; CHECK-SD-LABEL: loaddup_str_v2double:2346; CHECK-SD: // %bb.0: // %entry2347; CHECK-SD-NEXT: ld1r { v0.2d }, [x0]2348; CHECK-SD-NEXT: str xzr, [x0]2349; CHECK-SD-NEXT: ret2350;2351; CHECK-GI-LABEL: loaddup_str_v2double:2352; CHECK-GI: // %bb.0: // %entry2353; CHECK-GI-NEXT: ldr d0, [x0]2354; CHECK-GI-NEXT: str xzr, [x0]2355; CHECK-GI-NEXT: dup v0.2d, v0.d[0]2356; CHECK-GI-NEXT: ret2357entry:2358 %a = load double, ptr %p2359 %b = insertelement <2 x double> poison, double %a, i64 02360 store double 0.0, ptr %p2361 %c = shufflevector <2 x double> %b, <2 x double> poison, <2 x i32> zeroinitializer2362 ret <2 x double> %c2363}2364 2365define <3 x double> @dup_v3double(double %a) {2366; CHECK-SD-LABEL: dup_v3double:2367; CHECK-SD: // %bb.0: // %entry2368; CHECK-SD-NEXT: fmov d1, d02369; CHECK-SD-NEXT: fmov d2, d02370; CHECK-SD-NEXT: ret2371;2372; CHECK-GI-LABEL: dup_v3double:2373; CHECK-GI: // %bb.0: // %entry2374; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02375; CHECK-GI-NEXT: dup v3.2d, v0.d[0]2376; CHECK-GI-NEXT: dup v2.2d, v0.d[0]2377; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q22378; CHECK-GI-NEXT: mov d1, v3.d[1]2379; CHECK-GI-NEXT: fmov d0, d32380; CHECK-GI-NEXT: ret2381entry:2382 %b = insertelement <3 x double> poison, double %a, i64 02383 %c = shufflevector <3 x double> %b, <3 x double> poison, <3 x i32> zeroinitializer2384 ret <3 x double> %c2385}2386 2387define <3 x double> @duplane0_v3double(<3 x double> %b) {2388; CHECK-SD-LABEL: duplane0_v3double:2389; CHECK-SD: // %bb.0: // %entry2390; CHECK-SD-NEXT: fmov d1, d02391; CHECK-SD-NEXT: fmov d2, d02392; CHECK-SD-NEXT: ret2393;2394; CHECK-GI-LABEL: duplane0_v3double:2395; CHECK-GI: // %bb.0: // %entry2396; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02397; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q12398; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]2399; CHECK-GI-NEXT: dup v0.2d, v0.d[0]2400; CHECK-GI-NEXT: mov d1, v0.d[1]2401; CHECK-GI-NEXT: fmov d2, d02402; CHECK-GI-NEXT: ret2403entry:2404 %c = shufflevector <3 x double> %b, <3 x double> poison, <3 x i32> zeroinitializer2405 ret <3 x double> %c2406}2407 2408define <3 x double> @loaddup_v3double(ptr %p) {2409; CHECK-SD-LABEL: loaddup_v3double:2410; CHECK-SD: // %bb.0: // %entry2411; CHECK-SD-NEXT: ldr d0, [x0]2412; CHECK-SD-NEXT: fmov d1, d02413; CHECK-SD-NEXT: fmov d2, d02414; CHECK-SD-NEXT: ret2415;2416; CHECK-GI-LABEL: loaddup_v3double:2417; CHECK-GI: // %bb.0: // %entry2418; CHECK-GI-NEXT: ld1r { v0.2d }, [x0]2419; CHECK-GI-NEXT: ld1r { v2.2d }, [x0]2420; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q22421; CHECK-GI-NEXT: mov d1, v0.d[1]2422; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q02423; CHECK-GI-NEXT: ret2424entry:2425 %a = load double, ptr %p2426 %b = insertelement <3 x double> poison, double %a, i64 02427 %c = shufflevector <3 x double> %b, <3 x double> poison, <3 x i32> zeroinitializer2428 ret <3 x double> %c2429}2430 2431define <3 x double> @loaddup_str_v3double(ptr %p) {2432; CHECK-SD-LABEL: loaddup_str_v3double:2433; CHECK-SD: // %bb.0: // %entry2434; CHECK-SD-NEXT: ldr d0, [x0]2435; CHECK-SD-NEXT: str xzr, [x0]2436; CHECK-SD-NEXT: fmov d1, d02437; CHECK-SD-NEXT: fmov d2, d02438; CHECK-SD-NEXT: ret2439;2440; CHECK-GI-LABEL: loaddup_str_v3double:2441; CHECK-GI: // %bb.0: // %entry2442; CHECK-GI-NEXT: ldr d2, [x0]2443; CHECK-GI-NEXT: str xzr, [x0]2444; CHECK-GI-NEXT: dup v0.2d, v2.d[0]2445; CHECK-GI-NEXT: dup v2.2d, v2.d[0]2446; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q22447; CHECK-GI-NEXT: mov d1, v0.d[1]2448; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q02449; CHECK-GI-NEXT: ret2450entry:2451 %a = load double, ptr %p2452 %b = insertelement <3 x double> poison, double %a, i64 02453 store double 0.0, ptr %p2454 %c = shufflevector <3 x double> %b, <3 x double> poison, <3 x i32> zeroinitializer2455 ret <3 x double> %c2456}2457 2458define <4 x double> @dup_v4double(double %a) {2459; CHECK-SD-LABEL: dup_v4double:2460; CHECK-SD: // %bb.0: // %entry2461; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q02462; CHECK-SD-NEXT: dup v0.2d, v0.d[0]2463; CHECK-SD-NEXT: mov v1.16b, v0.16b2464; CHECK-SD-NEXT: ret2465;2466; CHECK-GI-LABEL: dup_v4double:2467; CHECK-GI: // %bb.0: // %entry2468; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02469; CHECK-GI-NEXT: dup v2.2d, v0.d[0]2470; CHECK-GI-NEXT: dup v1.2d, v0.d[0]2471; CHECK-GI-NEXT: mov v0.16b, v2.16b2472; CHECK-GI-NEXT: ret2473entry:2474 %b = insertelement <4 x double> poison, double %a, i64 02475 %c = shufflevector <4 x double> %b, <4 x double> poison, <4 x i32> zeroinitializer2476 ret <4 x double> %c2477}2478 2479define <4 x double> @duplane0_v4double(<4 x double> %b) {2480; CHECK-LABEL: duplane0_v4double:2481; CHECK: // %bb.0: // %entry2482; CHECK-NEXT: dup v0.2d, v0.d[0]2483; CHECK-NEXT: mov v1.16b, v0.16b2484; CHECK-NEXT: ret2485entry:2486 %c = shufflevector <4 x double> %b, <4 x double> poison, <4 x i32> zeroinitializer2487 ret <4 x double> %c2488}2489 2490define <4 x double> @loaddup_v4double(ptr %p) {2491; CHECK-SD-LABEL: loaddup_v4double:2492; CHECK-SD: // %bb.0: // %entry2493; CHECK-SD-NEXT: ld1r { v0.2d }, [x0]2494; CHECK-SD-NEXT: mov v1.16b, v0.16b2495; CHECK-SD-NEXT: ret2496;2497; CHECK-GI-LABEL: loaddup_v4double:2498; CHECK-GI: // %bb.0: // %entry2499; CHECK-GI-NEXT: ld1r { v0.2d }, [x0]2500; CHECK-GI-NEXT: ld1r { v1.2d }, [x0]2501; CHECK-GI-NEXT: ret2502entry:2503 %a = load double, ptr %p2504 %b = insertelement <4 x double> poison, double %a, i64 02505 %c = shufflevector <4 x double> %b, <4 x double> poison, <4 x i32> zeroinitializer2506 ret <4 x double> %c2507}2508 2509define <4 x double> @loaddup_str_v4double(ptr %p) {2510; CHECK-SD-LABEL: loaddup_str_v4double:2511; CHECK-SD: // %bb.0: // %entry2512; CHECK-SD-NEXT: ld1r { v0.2d }, [x0]2513; CHECK-SD-NEXT: str xzr, [x0]2514; CHECK-SD-NEXT: mov v1.16b, v0.16b2515; CHECK-SD-NEXT: ret2516;2517; CHECK-GI-LABEL: loaddup_str_v4double:2518; CHECK-GI: // %bb.0: // %entry2519; CHECK-GI-NEXT: ldr d1, [x0]2520; CHECK-GI-NEXT: str xzr, [x0]2521; CHECK-GI-NEXT: dup v0.2d, v1.d[0]2522; CHECK-GI-NEXT: dup v1.2d, v1.d[0]2523; CHECK-GI-NEXT: ret2524entry:2525 %a = load double, ptr %p2526 %b = insertelement <4 x double> poison, double %a, i64 02527 store double 0.0, ptr %p2528 %c = shufflevector <4 x double> %b, <4 x double> poison, <4 x i32> zeroinitializer2529 ret <4 x double> %c2530}2531 2532define <2 x fp128> @dup_v2fp128(fp128 %a) {2533; CHECK-LABEL: dup_v2fp128:2534; CHECK: // %bb.0: // %entry2535; CHECK-NEXT: mov v1.16b, v0.16b2536; CHECK-NEXT: ret2537entry:2538 %b = insertelement <2 x fp128> poison, fp128 %a, i64 02539 %c = shufflevector <2 x fp128> %b, <2 x fp128> poison, <2 x i32> zeroinitializer2540 ret <2 x fp128> %c2541}2542 2543define <2 x fp128> @duplane0_v2fp128(<2 x fp128> %b) {2544; CHECK-LABEL: duplane0_v2fp128:2545; CHECK: // %bb.0: // %entry2546; CHECK-NEXT: mov v1.16b, v0.16b2547; CHECK-NEXT: ret2548entry:2549 %c = shufflevector <2 x fp128> %b, <2 x fp128> poison, <2 x i32> zeroinitializer2550 ret <2 x fp128> %c2551}2552 2553define <2 x fp128> @loaddup_v2fp128(ptr %p) {2554; CHECK-LABEL: loaddup_v2fp128:2555; CHECK: // %bb.0: // %entry2556; CHECK-NEXT: ldr q0, [x0]2557; CHECK-NEXT: mov v1.16b, v0.16b2558; CHECK-NEXT: ret2559entry:2560 %a = load fp128, ptr %p2561 %b = insertelement <2 x fp128> poison, fp128 %a, i64 02562 %c = shufflevector <2 x fp128> %b, <2 x fp128> poison, <2 x i32> zeroinitializer2563 ret <2 x fp128> %c2564}2565 2566define <2 x fp128> @loaddup_str_v2fp128(ptr %p) {2567; CHECK-LABEL: loaddup_str_v2fp128:2568; CHECK: // %bb.0: // %entry2569; CHECK-NEXT: ldr q0, [x0]2570; CHECK-NEXT: adrp x8, .LCPI155_02571; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI155_0]2572; CHECK-NEXT: mov v1.16b, v0.16b2573; CHECK-NEXT: str q2, [x0]2574; CHECK-NEXT: ret2575entry:2576 %a = load fp128, ptr %p2577 %b = insertelement <2 x fp128> poison, fp128 %a, i64 02578 store fp128 0xL00000000000000000000000000000000, ptr %p2579 %c = shufflevector <2 x fp128> %b, <2 x fp128> poison, <2 x i32> zeroinitializer2580 ret <2 x fp128> %c2581}2582 2583define <3 x fp128> @dup_v3fp128(fp128 %a) {2584; CHECK-LABEL: dup_v3fp128:2585; CHECK: // %bb.0: // %entry2586; CHECK-NEXT: mov v1.16b, v0.16b2587; CHECK-NEXT: mov v2.16b, v0.16b2588; CHECK-NEXT: ret2589entry:2590 %b = insertelement <3 x fp128> poison, fp128 %a, i64 02591 %c = shufflevector <3 x fp128> %b, <3 x fp128> poison, <3 x i32> zeroinitializer2592 ret <3 x fp128> %c2593}2594 2595define <3 x fp128> @duplane0_v3fp128(<3 x fp128> %b) {2596; CHECK-LABEL: duplane0_v3fp128:2597; CHECK: // %bb.0: // %entry2598; CHECK-NEXT: mov v1.16b, v0.16b2599; CHECK-NEXT: mov v2.16b, v0.16b2600; CHECK-NEXT: ret2601entry:2602 %c = shufflevector <3 x fp128> %b, <3 x fp128> poison, <3 x i32> zeroinitializer2603 ret <3 x fp128> %c2604}2605 2606define <3 x fp128> @loaddup_v3fp128(ptr %p) {2607; CHECK-LABEL: loaddup_v3fp128:2608; CHECK: // %bb.0: // %entry2609; CHECK-NEXT: ldr q0, [x0]2610; CHECK-NEXT: mov v1.16b, v0.16b2611; CHECK-NEXT: mov v2.16b, v0.16b2612; CHECK-NEXT: ret2613entry:2614 %a = load fp128, ptr %p2615 %b = insertelement <3 x fp128> poison, fp128 %a, i64 02616 %c = shufflevector <3 x fp128> %b, <3 x fp128> poison, <3 x i32> zeroinitializer2617 ret <3 x fp128> %c2618}2619 2620define <3 x fp128> @loaddup_str_v3fp128(ptr %p) {2621; CHECK-LABEL: loaddup_str_v3fp128:2622; CHECK: // %bb.0: // %entry2623; CHECK-NEXT: ldr q0, [x0]2624; CHECK-NEXT: adrp x8, .LCPI159_02625; CHECK-NEXT: ldr q3, [x8, :lo12:.LCPI159_0]2626; CHECK-NEXT: mov v1.16b, v0.16b2627; CHECK-NEXT: mov v2.16b, v0.16b2628; CHECK-NEXT: str q3, [x0]2629; CHECK-NEXT: ret2630entry:2631 %a = load fp128, ptr %p2632 %b = insertelement <3 x fp128> poison, fp128 %a, i64 02633 store fp128 0xL00000000000000000000000000000000, ptr %p2634 %c = shufflevector <3 x fp128> %b, <3 x fp128> poison, <3 x i32> zeroinitializer2635 ret <3 x fp128> %c2636}2637 2638define <4 x fp128> @dup_v4fp128(fp128 %a) {2639; CHECK-LABEL: dup_v4fp128:2640; CHECK: // %bb.0: // %entry2641; CHECK-NEXT: mov v1.16b, v0.16b2642; CHECK-NEXT: mov v2.16b, v0.16b2643; CHECK-NEXT: mov v3.16b, v0.16b2644; CHECK-NEXT: ret2645entry:2646 %b = insertelement <4 x fp128> poison, fp128 %a, i64 02647 %c = shufflevector <4 x fp128> %b, <4 x fp128> poison, <4 x i32> zeroinitializer2648 ret <4 x fp128> %c2649}2650 2651define <4 x fp128> @duplane0_v4fp128(<4 x fp128> %b) {2652; CHECK-LABEL: duplane0_v4fp128:2653; CHECK: // %bb.0: // %entry2654; CHECK-NEXT: mov v1.16b, v0.16b2655; CHECK-NEXT: mov v2.16b, v0.16b2656; CHECK-NEXT: mov v3.16b, v0.16b2657; CHECK-NEXT: ret2658entry:2659 %c = shufflevector <4 x fp128> %b, <4 x fp128> poison, <4 x i32> zeroinitializer2660 ret <4 x fp128> %c2661}2662 2663define <4 x fp128> @loaddup_v4fp128(ptr %p) {2664; CHECK-LABEL: loaddup_v4fp128:2665; CHECK: // %bb.0: // %entry2666; CHECK-NEXT: ldr q0, [x0]2667; CHECK-NEXT: mov v1.16b, v0.16b2668; CHECK-NEXT: mov v2.16b, v0.16b2669; CHECK-NEXT: mov v3.16b, v0.16b2670; CHECK-NEXT: ret2671entry:2672 %a = load fp128, ptr %p2673 %b = insertelement <4 x fp128> poison, fp128 %a, i64 02674 %c = shufflevector <4 x fp128> %b, <4 x fp128> poison, <4 x i32> zeroinitializer2675 ret <4 x fp128> %c2676}2677 2678define <4 x fp128> @loaddup_str_v4fp128(ptr %p) {2679; CHECK-LABEL: loaddup_str_v4fp128:2680; CHECK: // %bb.0: // %entry2681; CHECK-NEXT: ldr q0, [x0]2682; CHECK-NEXT: adrp x8, .LCPI163_02683; CHECK-NEXT: ldr q4, [x8, :lo12:.LCPI163_0]2684; CHECK-NEXT: mov v1.16b, v0.16b2685; CHECK-NEXT: mov v2.16b, v0.16b2686; CHECK-NEXT: mov v3.16b, v0.16b2687; CHECK-NEXT: str q4, [x0]2688; CHECK-NEXT: ret2689entry:2690 %a = load fp128, ptr %p2691 %b = insertelement <4 x fp128> poison, fp128 %a, i64 02692 store fp128 0xL00000000000000000000000000000000, ptr %p2693 %c = shufflevector <4 x fp128> %b, <4 x fp128> poison, <4 x i32> zeroinitializer2694 ret <4 x fp128> %c2695}2696