; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16,+bf16,+sve | FileCheck %s define <8 x i8> @loadv8i8(ptr %p) { ; CHECK-LABEL: loadv8i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr b0, [x0] ; CHECK-NEXT: ret %l = load i8, ptr %p %v = insertelement <8 x i8> poison, i8 %l, i32 0 ret <8 x i8> %v } define <16 x i8> @loadv16i8(ptr %p) { ; CHECK-LABEL: loadv16i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr b0, [x0] ; CHECK-NEXT: ret %l = load i8, ptr %p %v = insertelement <16 x i8> poison, i8 %l, i32 0 ret <16 x i8> %v } define <4 x i16> @loadv4i16(ptr %p) { ; CHECK-LABEL: loadv4i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0] ; CHECK-NEXT: ret %l = load i16, ptr %p %v = insertelement <4 x i16> poison, i16 %l, i32 0 ret <4 x i16> %v } define <8 x i16> @loadv8i16(ptr %p) { ; CHECK-LABEL: loadv8i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0] ; CHECK-NEXT: ret %l = load i16, ptr %p %v = insertelement <8 x i16> poison, i16 %l, i32 0 ret <8 x i16> %v } define <2 x i32> @loadv2i32(ptr %p) { ; CHECK-LABEL: loadv2i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0] ; CHECK-NEXT: ret %l = load i32, ptr %p %v = insertelement <2 x i32> poison, i32 %l, i32 0 ret <2 x i32> %v } define <4 x i32> @loadv4i32(ptr %p) { ; CHECK-LABEL: loadv4i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0] ; CHECK-NEXT: ret %l = load i32, ptr %p %v = insertelement <4 x i32> poison, i32 %l, i32 0 ret <4 x i32> %v } define <2 x i64> @loadv2i64(ptr %p) { ; CHECK-LABEL: loadv2i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr d0, [x0] ; CHECK-NEXT: ret %l = load i64, ptr %p %v = insertelement <2 x i64> poison, i64 %l, i32 0 ret <2 x i64> %v } define <4 x half> @loadv4f16(ptr %p) { ; CHECK-LABEL: loadv4f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0] ; CHECK-NEXT: ret %l = load half, ptr %p %v = insertelement <4 x half> poison, half %l, i32 0 ret <4 x half> %v } define <8 x half> @loadv8f16(ptr %p) { ; CHECK-LABEL: loadv8f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0] ; CHECK-NEXT: ret %l = load half, ptr %p %v = insertelement <8 x half> poison, half %l, i32 0 ret <8 x half> %v } define <4 x bfloat> @loadv4bf16(ptr %p) { ; CHECK-LABEL: loadv4bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0] ; CHECK-NEXT: ret %l = load bfloat, ptr %p %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0 ret <4 x bfloat> %v } define <8 x bfloat> @loadv8bf16(ptr %p) { ; CHECK-LABEL: loadv8bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0] ; CHECK-NEXT: ret %l = load bfloat, ptr %p %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0 ret <8 x bfloat> %v } define <2 x float> @loadv2f32(ptr %p) { ; CHECK-LABEL: loadv2f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0] ; CHECK-NEXT: ret %l = load float, ptr %p %v = insertelement <2 x float> poison, float %l, i32 0 ret <2 x float> %v } define <4 x float> @loadv4f32(ptr %p) { ; CHECK-LABEL: loadv4f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0] ; CHECK-NEXT: ret %l = load float, ptr %p %v = insertelement <4 x float> poison, float %l, i32 0 ret <4 x float> %v } define <2 x double> @loadv2f64(ptr %p) { ; CHECK-LABEL: loadv2f64: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr d0, [x0] ; CHECK-NEXT: ret %l = load double, ptr %p %v = insertelement <2 x double> poison, double %l, i32 0 ret <2 x double> %v } ; Unscaled define <8 x i8> @loadv8i8_offset(ptr %p) { ; CHECK-LABEL: loadv8i8_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr b0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i8, ptr %g %v = insertelement <8 x i8> poison, i8 %l, i32 0 ret <8 x i8> %v } define <16 x i8> @loadv16i8_offset(ptr %p) { ; CHECK-LABEL: loadv16i8_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr b0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i8, ptr %g %v = insertelement <16 x i8> poison, i8 %l, i32 0 ret <16 x i8> %v } define <4 x i16> @loadv4i16_offset(ptr %p) { ; CHECK-LABEL: loadv4i16_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i16, ptr %g %v = insertelement <4 x i16> poison, i16 %l, i32 0 ret <4 x i16> %v } define <8 x i16> @loadv8i16_offset(ptr %p) { ; CHECK-LABEL: loadv8i16_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i16, ptr %g %v = insertelement <8 x i16> poison, i16 %l, i32 0 ret <8 x i16> %v } define <2 x i32> @loadv2i32_offset(ptr %p) { ; CHECK-LABEL: loadv2i32_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur s0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i32, ptr %g %v = insertelement <2 x i32> poison, i32 %l, i32 0 ret <2 x i32> %v } define <4 x i32> @loadv4i32_offset(ptr %p) { ; CHECK-LABEL: loadv4i32_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur s0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i32, ptr %g %v = insertelement <4 x i32> poison, i32 %l, i32 0 ret <4 x i32> %v } define <2 x i64> @loadv2i64_offset(ptr %p) { ; CHECK-LABEL: loadv2i64_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur d0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i64, ptr %g %v = insertelement <2 x i64> poison, i64 %l, i32 0 ret <2 x i64> %v } define <4 x half> @loadv4f16_offset(ptr %p) { ; CHECK-LABEL: loadv4f16_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load half, ptr %g %v = insertelement <4 x half> poison, half %l, i32 0 ret <4 x half> %v } define <8 x half> @loadv8f16_offset(ptr %p) { ; CHECK-LABEL: loadv8f16_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load half, ptr %g %v = insertelement <8 x half> poison, half %l, i32 0 ret <8 x half> %v } define <4 x bfloat> @loadv4bf16_offset(ptr %p) { ; CHECK-LABEL: loadv4bf16_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load bfloat, ptr %g %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0 ret <4 x bfloat> %v } define <8 x bfloat> @loadv8bf16_offset(ptr %p) { ; CHECK-LABEL: loadv8bf16_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load bfloat, ptr %g %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0 ret <8 x bfloat> %v } define <2 x float> @loadv2f32_offset(ptr %p) { ; CHECK-LABEL: loadv2f32_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur s0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load float, ptr %g %v = insertelement <2 x float> poison, float %l, i32 0 ret <2 x float> %v } define <4 x float> @loadv4f32_offset(ptr %p) { ; CHECK-LABEL: loadv4f32_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur s0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load float, ptr %g %v = insertelement <4 x float> poison, float %l, i32 0 ret <4 x float> %v } define <2 x double> @loadv2f64_offset(ptr %p) { ; CHECK-LABEL: loadv2f64_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur d0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load double, ptr %g %v = insertelement <2 x double> poison, double %l, i32 0 ret <2 x double> %v } define <8 x i8> @loadv8i8_noffset(ptr %p) { ; CHECK-LABEL: loadv8i8_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur b0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load i8, ptr %g %v = insertelement <8 x i8> poison, i8 %l, i32 0 ret <8 x i8> %v } define <16 x i8> @loadv16i8_noffset(ptr %p) { ; CHECK-LABEL: loadv16i8_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur b0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load i8, ptr %g %v = insertelement <16 x i8> poison, i8 %l, i32 0 ret <16 x i8> %v } define <4 x i16> @loadv4i16_noffset(ptr %p) { ; CHECK-LABEL: loadv4i16_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load i16, ptr %g %v = insertelement <4 x i16> poison, i16 %l, i32 0 ret <4 x i16> %v } define <8 x i16> @loadv8i16_noffset(ptr %p) { ; CHECK-LABEL: loadv8i16_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load i16, ptr %g %v = insertelement <8 x i16> poison, i16 %l, i32 0 ret <8 x i16> %v } define <2 x i32> @loadv2i32_noffset(ptr %p) { ; CHECK-LABEL: loadv2i32_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur s0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load i32, ptr %g %v = insertelement <2 x i32> poison, i32 %l, i32 0 ret <2 x i32> %v } define <4 x i32> @loadv4i32_noffset(ptr %p) { ; CHECK-LABEL: loadv4i32_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur s0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load i32, ptr %g %v = insertelement <4 x i32> poison, i32 %l, i32 0 ret <4 x i32> %v } define <2 x i64> @loadv2i64_noffset(ptr %p) { ; CHECK-LABEL: loadv2i64_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur d0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load i64, ptr %g %v = insertelement <2 x i64> poison, i64 %l, i32 0 ret <2 x i64> %v } define <4 x half> @loadv4f16_noffset(ptr %p) { ; CHECK-LABEL: loadv4f16_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load half, ptr %g %v = insertelement <4 x half> poison, half %l, i32 0 ret <4 x half> %v } define <8 x half> @loadv8f16_noffset(ptr %p) { ; CHECK-LABEL: loadv8f16_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load half, ptr %g %v = insertelement <8 x half> poison, half %l, i32 0 ret <8 x half> %v } define <4 x bfloat> @loadv4bf16_noffset(ptr %p) { ; CHECK-LABEL: loadv4bf16_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load bfloat, ptr %g %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0 ret <4 x bfloat> %v } define <8 x bfloat> @loadv8bf16_noffset(ptr %p) { ; CHECK-LABEL: loadv8bf16_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load bfloat, ptr %g %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0 ret <8 x bfloat> %v } define <2 x float> @loadv2f32_noffset(ptr %p) { ; CHECK-LABEL: loadv2f32_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur s0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load float, ptr %g %v = insertelement <2 x float> poison, float %l, i32 0 ret <2 x float> %v } define <4 x float> @loadv4f32_noffset(ptr %p) { ; CHECK-LABEL: loadv4f32_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur s0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load float, ptr %g %v = insertelement <4 x float> poison, float %l, i32 0 ret <4 x float> %v } define <2 x double> @loadv2f64_noffset(ptr %p) { ; CHECK-LABEL: loadv2f64_noffset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur d0, [x0, #-1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 -1 %l = load double, ptr %g %v = insertelement <2 x double> poison, double %l, i32 0 ret <2 x double> %v } ; ROW addressing modes define <8 x i8> @loadv8i8_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv8i8_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr b0, [x0, w1, sxtw] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i32 %o %l = load i8, ptr %g %v = insertelement <8 x i8> poison, i8 %l, i32 0 ret <8 x i8> %v } define <16 x i8> @loadv16i8_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv16i8_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr b0, [x0, w1, sxtw] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i32 %o %l = load i8, ptr %g %v = insertelement <16 x i8> poison, i8 %l, i32 0 ret <16 x i8> %v } define <4 x i16> @loadv4i16_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv4i16_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0, w1, sxtw #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i16, ptr %p, i32 %o %l = load i16, ptr %g %v = insertelement <4 x i16> poison, i16 %l, i32 0 ret <4 x i16> %v } define <8 x i16> @loadv8i16_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv8i16_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0, w1, sxtw #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i16, ptr %p, i32 %o %l = load i16, ptr %g %v = insertelement <8 x i16> poison, i16 %l, i32 0 ret <8 x i16> %v } define <2 x i32> @loadv2i32_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv2i32_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0, w1, sxtw #2] ; CHECK-NEXT: ret %g = getelementptr inbounds i32, ptr %p, i32 %o %l = load i32, ptr %g %v = insertelement <2 x i32> poison, i32 %l, i32 0 ret <2 x i32> %v } define <4 x i32> @loadv4i32_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv4i32_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0, w1, sxtw #2] ; CHECK-NEXT: ret %g = getelementptr inbounds i32, ptr %p, i32 %o %l = load i32, ptr %g %v = insertelement <4 x i32> poison, i32 %l, i32 0 ret <4 x i32> %v } define <2 x i64> @loadv2i64_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv2i64_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr d0, [x0, w1, sxtw #3] ; CHECK-NEXT: ret %g = getelementptr inbounds i64, ptr %p, i32 %o %l = load i64, ptr %g %v = insertelement <2 x i64> poison, i64 %l, i32 0 ret <2 x i64> %v } define <4 x half> @loadv4f16_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv4f16_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0, w1, sxtw #1] ; CHECK-NEXT: ret %g = getelementptr inbounds half, ptr %p, i32 %o %l = load half, ptr %g %v = insertelement <4 x half> poison, half %l, i32 0 ret <4 x half> %v } define <8 x half> @loadv8f16_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv8f16_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0, w1, sxtw #1] ; CHECK-NEXT: ret %g = getelementptr inbounds half, ptr %p, i32 %o %l = load half, ptr %g %v = insertelement <8 x half> poison, half %l, i32 0 ret <8 x half> %v } define <4 x bfloat> @loadv4bf16_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv4bf16_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0, w1, sxtw #1] ; CHECK-NEXT: ret %g = getelementptr inbounds bfloat, ptr %p, i32 %o %l = load bfloat, ptr %g %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0 ret <4 x bfloat> %v } define <8 x bfloat> @loadv8bf16_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv8bf16_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0, w1, sxtw #1] ; CHECK-NEXT: ret %g = getelementptr inbounds bfloat, ptr %p, i32 %o %l = load bfloat, ptr %g %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0 ret <8 x bfloat> %v } define <2 x float> @loadv2f32_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv2f32_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0, w1, sxtw #2] ; CHECK-NEXT: ret %g = getelementptr inbounds float, ptr %p, i32 %o %l = load float, ptr %g %v = insertelement <2 x float> poison, float %l, i32 0 ret <2 x float> %v } define <4 x float> @loadv4f32_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv4f32_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0, w1, sxtw #2] ; CHECK-NEXT: ret %g = getelementptr inbounds float, ptr %p, i32 %o %l = load float, ptr %g %v = insertelement <4 x float> poison, float %l, i32 0 ret <4 x float> %v } define <2 x double> @loadv2f64_roW(ptr %p, i32 %o) { ; CHECK-LABEL: loadv2f64_roW: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr d0, [x0, w1, sxtw #3] ; CHECK-NEXT: ret %g = getelementptr inbounds double, ptr %p, i32 %o %l = load double, ptr %g %v = insertelement <2 x double> poison, double %l, i32 0 ret <2 x double> %v } ; roX define <8 x i8> @loadv8i8_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv8i8_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr b0, [x0, x1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 %o %l = load i8, ptr %g %v = insertelement <8 x i8> poison, i8 %l, i32 0 ret <8 x i8> %v } define <16 x i8> @loadv16i8_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv16i8_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr b0, [x0, x1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 %o %l = load i8, ptr %g %v = insertelement <16 x i8> poison, i8 %l, i32 0 ret <16 x i8> %v } define <4 x i16> @loadv4i16_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv4i16_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0, x1, lsl #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i16, ptr %p, i64 %o %l = load i16, ptr %g %v = insertelement <4 x i16> poison, i16 %l, i32 0 ret <4 x i16> %v } define <8 x i16> @loadv8i16_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv8i16_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0, x1, lsl #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i16, ptr %p, i64 %o %l = load i16, ptr %g %v = insertelement <8 x i16> poison, i16 %l, i32 0 ret <8 x i16> %v } define <2 x i32> @loadv2i32_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv2i32_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0, x1, lsl #2] ; CHECK-NEXT: ret %g = getelementptr inbounds i32, ptr %p, i64 %o %l = load i32, ptr %g %v = insertelement <2 x i32> poison, i32 %l, i32 0 ret <2 x i32> %v } define <4 x i32> @loadv4i32_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv4i32_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0, x1, lsl #2] ; CHECK-NEXT: ret %g = getelementptr inbounds i32, ptr %p, i64 %o %l = load i32, ptr %g %v = insertelement <4 x i32> poison, i32 %l, i32 0 ret <4 x i32> %v } define <2 x i64> @loadv2i64_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv2i64_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr d0, [x0, x1, lsl #3] ; CHECK-NEXT: ret %g = getelementptr inbounds i64, ptr %p, i64 %o %l = load i64, ptr %g %v = insertelement <2 x i64> poison, i64 %l, i32 0 ret <2 x i64> %v } define <4 x half> @loadv4f16_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv4f16_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0, x1, lsl #1] ; CHECK-NEXT: ret %g = getelementptr inbounds half, ptr %p, i64 %o %l = load half, ptr %g %v = insertelement <4 x half> poison, half %l, i32 0 ret <4 x half> %v } define <8 x half> @loadv8f16_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv8f16_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0, x1, lsl #1] ; CHECK-NEXT: ret %g = getelementptr inbounds half, ptr %p, i64 %o %l = load half, ptr %g %v = insertelement <8 x half> poison, half %l, i32 0 ret <8 x half> %v } define <4 x bfloat> @loadv4bf16_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv4bf16_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0, x1, lsl #1] ; CHECK-NEXT: ret %g = getelementptr inbounds bfloat, ptr %p, i64 %o %l = load bfloat, ptr %g %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0 ret <4 x bfloat> %v } define <8 x bfloat> @loadv8bf16_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv8bf16_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0, x1, lsl #1] ; CHECK-NEXT: ret %g = getelementptr inbounds bfloat, ptr %p, i64 %o %l = load bfloat, ptr %g %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0 ret <8 x bfloat> %v } define <2 x float> @loadv2f32_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv2f32_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0, x1, lsl #2] ; CHECK-NEXT: ret %g = getelementptr inbounds float, ptr %p, i64 %o %l = load float, ptr %g %v = insertelement <2 x float> poison, float %l, i32 0 ret <2 x float> %v } define <4 x float> @loadv4f32_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv4f32_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0, x1, lsl #2] ; CHECK-NEXT: ret %g = getelementptr inbounds float, ptr %p, i64 %o %l = load float, ptr %g %v = insertelement <4 x float> poison, float %l, i32 0 ret <4 x float> %v } define <2 x double> @loadv2f64_roX(ptr %p, i64 %o) { ; CHECK-LABEL: loadv2f64_roX: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr d0, [x0, x1, lsl #3] ; CHECK-NEXT: ret %g = getelementptr inbounds double, ptr %p, i64 %o %l = load double, ptr %g %v = insertelement <2 x double> poison, double %l, i32 0 ret <2 x double> %v } ; SVE define @loadnxv8i8(ptr %p) { ; CHECK-LABEL: loadnxv8i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ldrb w8, [x0] ; CHECK-NEXT: fmov s0, w8 ; CHECK-NEXT: ret %l = load i8, ptr %p %v = insertelement poison, i8 %l, i32 0 ret %v } define @loadnxv16i8(ptr %p) { ; CHECK-LABEL: loadnxv16i8: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr b0, [x0] ; CHECK-NEXT: ret %l = load i8, ptr %p %v = insertelement poison, i8 %l, i32 0 ret %v } define @loadnxv4i16(ptr %p) { ; CHECK-LABEL: loadnxv4i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ldrh w8, [x0] ; CHECK-NEXT: fmov s0, w8 ; CHECK-NEXT: ret %l = load i16, ptr %p %v = insertelement poison, i16 %l, i32 0 ret %v } define @loadnxv8i16(ptr %p) { ; CHECK-LABEL: loadnxv8i16: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0] ; CHECK-NEXT: ret %l = load i16, ptr %p %v = insertelement poison, i16 %l, i32 0 ret %v } define @loadnxv2i32(ptr %p) { ; CHECK-LABEL: loadnxv2i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr w8, [x0] ; CHECK-NEXT: fmov d0, x8 ; CHECK-NEXT: ret %l = load i32, ptr %p %v = insertelement poison, i32 %l, i32 0 ret %v } define @loadnxv4i32(ptr %p) { ; CHECK-LABEL: loadnxv4i32: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0] ; CHECK-NEXT: ret %l = load i32, ptr %p %v = insertelement poison, i32 %l, i32 0 ret %v } define @loadnxv2i64(ptr %p) { ; CHECK-LABEL: loadnxv2i64: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr d0, [x0] ; CHECK-NEXT: ret %l = load i64, ptr %p %v = insertelement poison, i64 %l, i32 0 ret %v } define @loadnxv4f16(ptr %p) { ; CHECK-LABEL: loadnxv4f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0] ; CHECK-NEXT: ret %l = load half, ptr %p %v = insertelement poison, half %l, i32 0 ret %v } define @loadnxv8f16(ptr %p) { ; CHECK-LABEL: loadnxv8f16: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0] ; CHECK-NEXT: ret %l = load half, ptr %p %v = insertelement poison, half %l, i32 0 ret %v } define @loadnxv4bf16(ptr %p) { ; CHECK-LABEL: loadnxv4bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0] ; CHECK-NEXT: ret %l = load bfloat, ptr %p %v = insertelement poison, bfloat %l, i32 0 ret %v } define @loadnxv8bf16(ptr %p) { ; CHECK-LABEL: loadnxv8bf16: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr h0, [x0] ; CHECK-NEXT: ret %l = load bfloat, ptr %p %v = insertelement poison, bfloat %l, i32 0 ret %v } define @loadnxv2f32(ptr %p) { ; CHECK-LABEL: loadnxv2f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0] ; CHECK-NEXT: ret %l = load float, ptr %p %v = insertelement poison, float %l, i32 0 ret %v } define @loadnxv4f32(ptr %p) { ; CHECK-LABEL: loadnxv4f32: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr s0, [x0] ; CHECK-NEXT: ret %l = load float, ptr %p %v = insertelement poison, float %l, i32 0 ret %v } define @loadnxv2f64(ptr %p) { ; CHECK-LABEL: loadnxv2f64: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr d0, [x0] ; CHECK-NEXT: ret %l = load double, ptr %p %v = insertelement poison, double %l, i32 0 ret %v } ; Unscaled define @loadnxv8i8_offset(ptr %p) { ; CHECK-LABEL: loadnxv8i8_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldrb w8, [x0, #1] ; CHECK-NEXT: fmov s0, w8 ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i8, ptr %g %v = insertelement poison, i8 %l, i32 0 ret %v } define @loadnxv16i8_offset(ptr %p) { ; CHECK-LABEL: loadnxv16i8_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldr b0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i8, ptr %g %v = insertelement poison, i8 %l, i32 0 ret %v } define @loadnxv4i16_offset(ptr %p) { ; CHECK-LABEL: loadnxv4i16_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldurh w8, [x0, #1] ; CHECK-NEXT: fmov s0, w8 ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i16, ptr %g %v = insertelement poison, i16 %l, i32 0 ret %v } define @loadnxv8i16_offset(ptr %p) { ; CHECK-LABEL: loadnxv8i16_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i16, ptr %g %v = insertelement poison, i16 %l, i32 0 ret %v } define @loadnxv2i32_offset(ptr %p) { ; CHECK-LABEL: loadnxv2i32_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur w8, [x0, #1] ; CHECK-NEXT: fmov d0, x8 ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i32, ptr %g %v = insertelement poison, i32 %l, i32 0 ret %v } define @loadnxv4i32_offset(ptr %p) { ; CHECK-LABEL: loadnxv4i32_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur s0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i32, ptr %g %v = insertelement poison, i32 %l, i32 0 ret %v } define @loadnxv2i64_offset(ptr %p) { ; CHECK-LABEL: loadnxv2i64_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur d0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load i64, ptr %g %v = insertelement poison, i64 %l, i32 0 ret %v } define @loadnxv4f16_offset(ptr %p) { ; CHECK-LABEL: loadnxv4f16_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load half, ptr %g %v = insertelement poison, half %l, i32 0 ret %v } define @loadnxv8f16_offset(ptr %p) { ; CHECK-LABEL: loadnxv8f16_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load half, ptr %g %v = insertelement poison, half %l, i32 0 ret %v } define @loadnxv4bf16_offset(ptr %p) { ; CHECK-LABEL: loadnxv4bf16_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load bfloat, ptr %g %v = insertelement poison, bfloat %l, i32 0 ret %v } define @loadnxv8bf16_offset(ptr %p) { ; CHECK-LABEL: loadnxv8bf16_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur h0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load bfloat, ptr %g %v = insertelement poison, bfloat %l, i32 0 ret %v } define @loadnxv2f32_offset(ptr %p) { ; CHECK-LABEL: loadnxv2f32_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur s0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load float, ptr %g %v = insertelement poison, float %l, i32 0 ret %v } define @loadnxv4f32_offset(ptr %p) { ; CHECK-LABEL: loadnxv4f32_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur s0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load float, ptr %g %v = insertelement poison, float %l, i32 0 ret %v } define @loadnxv2f64_offset(ptr %p) { ; CHECK-LABEL: loadnxv2f64_offset: ; CHECK: // %bb.0: ; CHECK-NEXT: ldur d0, [x0, #1] ; CHECK-NEXT: ret %g = getelementptr inbounds i8, ptr %p, i64 1 %l = load double, ptr %g %v = insertelement poison, double %l, i32 0 ret %v }