1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s | FileCheck %s 3 4target triple = "aarch64-unknown-linux-gnu" 5 6; half vectors 7 8define <vscale x 4 x half> @insert_into_poison_nxv4f16_nxv2f16_0(<vscale x 2 x half> %a) #0 { 9; CHECK-LABEL: insert_into_poison_nxv4f16_nxv2f16_0: 10; CHECK: // %bb.0: 11; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 12; CHECK-NEXT: ret 13 %res = call <vscale x 4 x half> @llvm.vector.insert.nxv4f16.nxv2f16(<vscale x 4 x half> poison, <vscale x 2 x half> %a, i64 0) 14 ret <vscale x 4 x half> %res 15} 16 17define <vscale x 4 x half> @insert_into_poison_nxv4f16_nxv2f16_2(<vscale x 2 x half> %a) #0 { 18; CHECK-LABEL: insert_into_poison_nxv4f16_nxv2f16_2: 19; CHECK: // %bb.0: 20; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 21; CHECK-NEXT: ret 22 %res = call <vscale x 4 x half> @llvm.vector.insert.nxv4f16.nxv2f16(<vscale x 4 x half> poison, <vscale x 2 x half> %a, i64 2) 23 ret <vscale x 4 x half> %res 24} 25 26define <vscale x 8 x half> @insert_into_poison_nxv8f16_nxv2f16_0(<vscale x 2 x half> %a) #0 { 27; CHECK-LABEL: insert_into_poison_nxv8f16_nxv2f16_0: 28; CHECK: // %bb.0: 29; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 30; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 31; CHECK-NEXT: ret 32 %res = call <vscale x 8 x half> @llvm.vector.insert.nxv8f16.nxv2f16(<vscale x 8 x half> poison, <vscale x 2 x half> %a, i64 0) 33 ret <vscale x 8 x half> %res 34} 35 36define <vscale x 8 x half> @insert_into_poison_nxv8f16_nxv2f16_2(<vscale x 2 x half> %a) #0 { 37; CHECK-LABEL: insert_into_poison_nxv8f16_nxv2f16_2: 38; CHECK: // %bb.0: 39; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 40; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 41; CHECK-NEXT: ret 42 %res = call <vscale x 8 x half> @llvm.vector.insert.nxv8f16.nxv2f16(<vscale x 8 x half> poison, <vscale x 2 x half> %a, i64 2) 43 ret <vscale x 8 x half> %res 44} 45 46define <vscale x 8 x half> @insert_into_poison_nxv8f16_nxv2f16_4(<vscale x 2 x half> %a) #0 { 47; CHECK-LABEL: insert_into_poison_nxv8f16_nxv2f16_4: 48; CHECK: // %bb.0: 49; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 50; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 51; CHECK-NEXT: ret 52 %res = call <vscale x 8 x half> @llvm.vector.insert.nxv8f16.nxv2f16(<vscale x 8 x half> poison, <vscale x 2 x half> %a, i64 4) 53 ret <vscale x 8 x half> %res 54} 55 56define <vscale x 8 x half> @insert_into_poison_nxv8f16_nxv2f16_6(<vscale x 2 x half> %a) #0 { 57; CHECK-LABEL: insert_into_poison_nxv8f16_nxv2f16_6: 58; CHECK: // %bb.0: 59; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 60; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 61; CHECK-NEXT: ret 62 %res = call <vscale x 8 x half> @llvm.vector.insert.nxv8f16.nxv2f16(<vscale x 8 x half> poison, <vscale x 2 x half> %a, i64 6) 63 ret <vscale x 8 x half> %res 64} 65 66define <vscale x 8 x half> @insert_into_poison_nxv8f16_nxv4f16_0(<vscale x 4 x half> %a) #0 { 67; CHECK-LABEL: insert_into_poison_nxv8f16_nxv4f16_0: 68; CHECK: // %bb.0: 69; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 70; CHECK-NEXT: ret 71 %res = call <vscale x 8 x half> @llvm.vector.insert.nxv8f16.nxv4f16(<vscale x 8 x half> poison, <vscale x 4 x half> %a, i64 0) 72 ret <vscale x 8 x half> %res 73} 74 75define <vscale x 8 x half> @insert_into_poison_nxv8f16_nxv4f16_4(<vscale x 4 x half> %a) #0 { 76; CHECK-LABEL: insert_into_poison_nxv8f16_nxv4f16_4: 77; CHECK: // %bb.0: 78; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 79; CHECK-NEXT: ret 80 %res = call <vscale x 8 x half> @llvm.vector.insert.nxv8f16.nxv4f16(<vscale x 8 x half> poison, <vscale x 4 x half> %a, i64 4) 81 ret <vscale x 8 x half> %res 82} 83 84; float vectors 85define <vscale x 4 x float> @insert_into_poison_nxv4f32_nxv2f32_0(<vscale x 2 x float> %a) #0 { 86; CHECK-LABEL: insert_into_poison_nxv4f32_nxv2f32_0: 87; CHECK: // %bb.0: 88; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 89; CHECK-NEXT: ret 90 %res = call <vscale x 4 x float> @llvm.vector.insert.nxv4f32.nxv2f32(<vscale x 4 x float> poison, <vscale x 2 x float> %a, i64 0) 91 ret <vscale x 4 x float> %res 92} 93 94define <vscale x 4 x float> @insert_into_poison_nxv4f32_nxv2f32_2(<vscale x 2 x float> %a) #0 { 95; CHECK-LABEL: insert_into_poison_nxv4f32_nxv2f32_2: 96; CHECK: // %bb.0: 97; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 98; CHECK-NEXT: ret 99 %res = call <vscale x 4 x float> @llvm.vector.insert.nxv4f32.nxv2f32(<vscale x 4 x float> poison, <vscale x 2 x float> %a, i64 2) 100 ret <vscale x 4 x float> %res 101} 102 103; bfloat vectors 104 105define <vscale x 4 x bfloat> @insert_into_poison_nxv4bf16_nxv2bf16_0(<vscale x 2 x bfloat> %a) #0 { 106; CHECK-LABEL: insert_into_poison_nxv4bf16_nxv2bf16_0: 107; CHECK: // %bb.0: 108; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 109; CHECK-NEXT: ret 110 %res = call <vscale x 4 x bfloat> @llvm.vector.insert.nxv4bf16.nxv2bf16(<vscale x 4 x bfloat> poison, <vscale x 2 x bfloat> %a, i64 0) 111 ret <vscale x 4 x bfloat> %res 112} 113 114define <vscale x 4 x bfloat> @insert_into_poison_nxv4bf16_nxv2bf16_2(<vscale x 2 x bfloat> %a) #0 { 115; CHECK-LABEL: insert_into_poison_nxv4bf16_nxv2bf16_2: 116; CHECK: // %bb.0: 117; CHECK-NEXT: uzp1 z0.s, z0.s, z0.s 118; CHECK-NEXT: ret 119 %res = call <vscale x 4 x bfloat> @llvm.vector.insert.nxv4bf16.nxv2bf16(<vscale x 4 x bfloat> poison, <vscale x 2 x bfloat> %a, i64 2) 120 ret <vscale x 4 x bfloat> %res 121} 122 123define <vscale x 8 x bfloat> @insert_into_poison_nxv8bf16_nxv2bf16_0(<vscale x 2 x bfloat> %a) #0 { 124; CHECK-LABEL: insert_into_poison_nxv8bf16_nxv2bf16_0: 125; CHECK: // %bb.0: 126; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 127; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 128; CHECK-NEXT: ret 129 %res = call <vscale x 8 x bfloat> @llvm.vector.insert.nxv8bf16.nxv2bf16(<vscale x 8 x bfloat> poison, <vscale x 2 x bfloat> %a, i64 0) 130 ret <vscale x 8 x bfloat> %res 131} 132 133define <vscale x 8 x bfloat> @insert_into_poison_nxv8bf16_nxv2bf16_2(<vscale x 2 x bfloat> %a) #0 { 134; CHECK-LABEL: insert_into_poison_nxv8bf16_nxv2bf16_2: 135; CHECK: // %bb.0: 136; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 137; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 138; CHECK-NEXT: ret 139 %res = call <vscale x 8 x bfloat> @llvm.vector.insert.nxv8bf16.nxv2bf16(<vscale x 8 x bfloat> poison, <vscale x 2 x bfloat> %a, i64 2) 140 ret <vscale x 8 x bfloat> %res 141} 142 143define <vscale x 8 x bfloat> @insert_into_poison_nxv8bf16_nxv2bf16_4(<vscale x 2 x bfloat> %a) #0 { 144; CHECK-LABEL: insert_into_poison_nxv8bf16_nxv2bf16_4: 145; CHECK: // %bb.0: 146; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 147; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 148; CHECK-NEXT: ret 149 %res = call <vscale x 8 x bfloat> @llvm.vector.insert.nxv8bf16.nxv2bf16(<vscale x 8 x bfloat> poison, <vscale x 2 x bfloat> %a, i64 4) 150 ret <vscale x 8 x bfloat> %res 151} 152 153define <vscale x 8 x bfloat> @insert_into_poison_nxv8bf16_nxv2bf16_6(<vscale x 2 x bfloat> %a) #0 { 154; CHECK-LABEL: insert_into_poison_nxv8bf16_nxv2bf16_6: 155; CHECK: // %bb.0: 156; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 157; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 158; CHECK-NEXT: ret 159 %res = call <vscale x 8 x bfloat> @llvm.vector.insert.nxv8bf16.nxv2bf16(<vscale x 8 x bfloat> poison, <vscale x 2 x bfloat> %a, i64 6) 160 ret <vscale x 8 x bfloat> %res 161} 162 163define <vscale x 8 x bfloat> @insert_into_poison_nxv8bf16_nxv4bf16_0(<vscale x 4 x bfloat> %a) #0 { 164; CHECK-LABEL: insert_into_poison_nxv8bf16_nxv4bf16_0: 165; CHECK: // %bb.0: 166; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 167; CHECK-NEXT: ret 168 %res = call <vscale x 8 x bfloat> @llvm.vector.insert.nxv8bf16.nxv4bf16(<vscale x 8 x bfloat> poison, <vscale x 4 x bfloat> %a, i64 0) 169 ret <vscale x 8 x bfloat> %res 170} 171 172define <vscale x 8 x bfloat> @insert_into_poison_nxv8bf16_nxv4bf16_4(<vscale x 4 x bfloat> %a) #0 { 173; CHECK-LABEL: insert_into_poison_nxv8bf16_nxv4bf16_4: 174; CHECK: // %bb.0: 175; CHECK-NEXT: uzp1 z0.h, z0.h, z0.h 176; CHECK-NEXT: ret 177 %res = call <vscale x 8 x bfloat> @llvm.vector.insert.nxv8bf16.nxv4bf16(<vscale x 8 x bfloat> poison, <vscale x 4 x bfloat> %a, i64 4) 178 ret <vscale x 8 x bfloat> %res 179} 180 181attributes #0 = { "target-features"="+sve,+bf16" } 182 183declare <vscale x 4 x half> @llvm.vector.insert.nxv4f16.nxv2f16(<vscale x 4 x half>, <vscale x 2 x half>, i64) 184declare <vscale x 8 x half> @llvm.vector.insert.nxv8f16.nxv2f16(<vscale x 8 x half>, <vscale x 2 x half>, i64) 185declare <vscale x 8 x half> @llvm.vector.insert.nxv8f16.nxv4f16(<vscale x 8 x half>, <vscale x 4 x half>, i64) 186 187declare <vscale x 4 x float> @llvm.vector.insert.nxv4f32.nxv2f32(<vscale x 4 x float>, <vscale x 2 x float>, i64) 188 189declare <vscale x 4 x bfloat> @llvm.vector.insert.nxv4bf16.nxv2bf16(<vscale x 4 x bfloat>, <vscale x 2 x bfloat>, i64) 190declare <vscale x 8 x bfloat> @llvm.vector.insert.nxv8bf16.nxv2bf16(<vscale x 8 x bfloat>, <vscale x 2 x bfloat>, i64) 191declare <vscale x 8 x bfloat> @llvm.vector.insert.nxv8bf16.nxv4bf16(<vscale x 8 x bfloat>, <vscale x 4 x bfloat>, i64) 192 193