; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mattr=+sve -force-streaming-compatible-sve < %s | FileCheck %s ; RUN: llc -mattr=+sme -force-streaming-compatible-sve < %s | FileCheck %s target triple = "aarch64-unknown-linux-gnu" define void @build_vector_7_inc1_v4i1(ptr %a) { ; CHECK-LABEL: build_vector_7_inc1_v4i1: ; CHECK: // %bb.0: ; CHECK-NEXT: mov w8, #5 // =0x5 ; CHECK-NEXT: strb w8, [x0] ; CHECK-NEXT: ret store <4 x i1> , ptr %a, align 1 ret void } define void @build_vector_7_inc1_v32i8(ptr %a) { ; CHECK-LABEL: build_vector_7_inc1_v32i8: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.b, #0, #1 ; CHECK-NEXT: mov z1.d, z0.d ; CHECK-NEXT: add z0.b, z0.b, #7 // =0x7 ; CHECK-NEXT: add z1.b, z1.b, #23 // =0x17 ; CHECK-NEXT: stp q0, q1, [x0] ; CHECK-NEXT: ret store <32 x i8> , ptr %a, align 1 ret void } define void @build_vector_0_inc2_v16i16(ptr %a) { ; CHECK-LABEL: build_vector_0_inc2_v16i16: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.h, #0, #2 ; CHECK-NEXT: str q0, [x0] ; CHECK-NEXT: add z0.h, z0.h, #16 // =0x10 ; CHECK-NEXT: str q0, [x0, #16] ; CHECK-NEXT: ret store <16 x i16> , ptr %a, align 2 ret void } ; Negative const stride. define void @build_vector_0_dec3_v8i32(ptr %a) { ; CHECK-LABEL: build_vector_0_dec3_v8i32: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.s, #0, #-3 ; CHECK-NEXT: mov z1.s, #-12 // =0xfffffffffffffff4 ; CHECK-NEXT: add z1.s, z0.s, z1.s ; CHECK-NEXT: stp q0, q1, [x0] ; CHECK-NEXT: ret store <8 x i32> , ptr %a, align 4 ret void } ; Constant stride that's too big to be directly encoded into the index. define void @build_vector_minus2_dec32_v4i64(ptr %a) { ; CHECK-LABEL: build_vector_minus2_dec32_v4i64: ; CHECK: // %bb.0: ; CHECK-NEXT: mov x8, #-32 // =0xffffffffffffffe0 ; CHECK-NEXT: mov z1.d, #-66 // =0xffffffffffffffbe ; CHECK-NEXT: mov z2.d, #-2 // =0xfffffffffffffffe ; CHECK-NEXT: index z0.d, #0, x8 ; CHECK-NEXT: add z1.d, z0.d, z1.d ; CHECK-NEXT: add z0.d, z0.d, z2.d ; CHECK-NEXT: stp q0, q1, [x0] ; CHECK-NEXT: ret store <4 x i64> , ptr %a, align 8 ret void } ; Constant but not a sequence. define void @build_vector_no_stride_v4i64(ptr %a) { ; CHECK-LABEL: build_vector_no_stride_v4i64: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.d, #1, #7 ; CHECK-NEXT: index z1.d, #0, #4 ; CHECK-NEXT: stp q1, q0, [x0] ; CHECK-NEXT: ret store <4 x i64> , ptr %a, align 8 ret void } define void @build_vector_0_inc2_v16f16(ptr %a) { ; CHECK-LABEL: build_vector_0_inc2_v16f16: ; CHECK: // %bb.0: ; CHECK-NEXT: adrp x8, .LCPI6_0 ; CHECK-NEXT: adrp x9, .LCPI6_1 ; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI6_0] ; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI6_1] ; CHECK-NEXT: stp q1, q0, [x0] ; CHECK-NEXT: ret store <16 x half> , ptr %a, align 2 ret void } ; Negative const stride. define void @build_vector_0_dec3_v8f32(ptr %a) { ; CHECK-LABEL: build_vector_0_dec3_v8f32: ; CHECK: // %bb.0: ; CHECK-NEXT: adrp x8, .LCPI7_0 ; CHECK-NEXT: adrp x9, .LCPI7_1 ; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI7_0] ; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI7_1] ; CHECK-NEXT: stp q1, q0, [x0] ; CHECK-NEXT: ret store <8 x float> , ptr %a, align 4 ret void } ; Constant stride that's too big to be directly encoded into the index. define void @build_vector_minus2_dec32_v4f64(ptr %a) { ; CHECK-LABEL: build_vector_minus2_dec32_v4f64: ; CHECK: // %bb.0: ; CHECK-NEXT: adrp x8, .LCPI8_0 ; CHECK-NEXT: adrp x9, .LCPI8_1 ; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI8_0] ; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI8_1] ; CHECK-NEXT: stp q1, q0, [x0] ; CHECK-NEXT: ret store <4 x double> , ptr %a, align 8 ret void } ; Constant but not a sequence. define void @build_vector_no_stride_v4f64(ptr %a) { ; CHECK-LABEL: build_vector_no_stride_v4f64: ; CHECK: // %bb.0: ; CHECK-NEXT: adrp x8, .LCPI9_0 ; CHECK-NEXT: adrp x9, .LCPI9_1 ; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI9_0] ; CHECK-NEXT: ldr q1, [x9, :lo12:.LCPI9_1] ; CHECK-NEXT: stp q1, q0, [x0] ; CHECK-NEXT: ret store <4 x double> , ptr %a, align 8 ret void }