; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s ; 128-bit vectors define <16 x i8> @v16i8() #0 { ; CHECK-LABEL: v16i8: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.b, #0, #1 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 ; CHECK-NEXT: ret ret <16 x i8> } define <8 x i16> @v8i16() #0 { ; CHECK-LABEL: v8i16: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.h, #0, #1 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 ; CHECK-NEXT: ret ret <8 x i16> } define <4 x i32> @v4i32() #0 { ; CHECK-LABEL: v4i32: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.s, #0, #1 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 ; CHECK-NEXT: ret ret <4 x i32> } define <2 x i64> @v2i64() #0 { ; CHECK-LABEL: v2i64: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.d, #0, #1 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 ; CHECK-NEXT: ret ret <2 x i64> } ; 64-bit vectors define <8 x i8> @v8i8() #0 { ; CHECK-LABEL: v8i8: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.b, #0, #1 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 ; CHECK-NEXT: ret ret <8 x i8> } define <4 x i16> @v4i16() #0 { ; CHECK-LABEL: v4i16: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.h, #0, #1 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 ; CHECK-NEXT: ret ret <4 x i16> } define <2 x i32> @v2i32() #0 { ; CHECK-LABEL: v2i32: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.s, #0, #1 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 ; CHECK-NEXT: ret ret <2 x i32> } ; Positive test, non-zero start and non-unitary step. ; Note: This should be INDEX z0.s, #1, #2 (without the ORR). define <4 x i32> @v4i32_non_zero_non_one() #0 { ; CHECK-LABEL: v4i32_non_zero_non_one: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.s, #0, #2 ; CHECK-NEXT: orr z0.s, z0.s, #0x1 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 ; CHECK-NEXT: ret ret <4 x i32> } ; Positive test, same as above but negative immediates. define <4 x i32> @v4i32_neg_immediates() #0 { ; CHECK-LABEL: v4i32_neg_immediates: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.s, #-1, #-2 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 ; CHECK-NEXT: ret ret <4 x i32> } ; Positive test, out of imm range start. define <4 x i32> @v4i32_out_range_start() #0 { ; CHECK-LABEL: v4i32_out_range_start: ; CHECK: // %bb.0: ; CHECK-NEXT: index z0.s, #0, #1 ; CHECK-NEXT: add z0.s, z0.s, #16 // =0x10 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 ; CHECK-NEXT: ret ret <4 x i32> } ; Positive test, out of imm range step. define <4 x i32> @v4i32_out_range_step() #0 { ; CHECK-LABEL: v4i32_out_range_step: ; CHECK: // %bb.0: ; CHECK-NEXT: mov w8, #16 // =0x10 ; CHECK-NEXT: index z0.s, #0, w8 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 ; CHECK-NEXT: ret ret <4 x i32> } ; Positive test, out of imm range start and step. define <4 x i32> @v4i32_out_range_start_step() #0 { ; CHECK-LABEL: v4i32_out_range_start_step: ; CHECK: // %bb.0: ; CHECK-NEXT: mov w8, #16 // =0x10 ; CHECK-NEXT: index z0.s, #0, w8 ; CHECK-NEXT: add z0.s, z0.s, #16 // =0x10 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 ; CHECK-NEXT: ret ret <4 x i32> } ; Negative test, non sequential. define <4 x i32> @v4i32_non_sequential() #0 { ; CHECK-LABEL: v4i32_non_sequential: ; CHECK: // %bb.0: ; CHECK-NEXT: adrp x8, .LCPI12_0 ; CHECK-NEXT: ldr q0, [x8, :lo12:.LCPI12_0] ; CHECK-NEXT: ret ret <4 x i32> }