brintos

brintos / llvm-project-archived public Read only

0
0
Text · 82.0 KiB · 6df6d76 Raw
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